我已经看过这里发布的一些关于此事的问题,但仍然无法解决为什么我的2d HUD出现但让我的3D渲染世界消失了.
编辑:似乎2d场景正在控制整个屏幕所以我时不时地看到3D场景在2d场景中出现故障.因此即使我只渲染一个10 x 10像素的四边形,它也会渲染出来,然后将剩余的屏幕空白.
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(40.0,(GLdouble)x/(GLdouble)y,0.5,20.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0,0,x,y);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0,-0.5,-6.0);
glPushMatrix();
..Draw some 3d stuff...
glPopMatrix();
// Start 2d
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glColor3f(0.0f, 255.0f, 1.0f);
glBegin(GL_QUADS);
glVertex2f(0.0, 0.0);
glVertex2f(10.0, 0.0);
glVertex2f(10.0, 10.0);
glVertex2f(0.0, 10.0);
glEnd();
Run Code Online (Sandbox Code Playgroud)
然后我交换缓冲区
这是我的代码的顺序.就像它使得3d空间然后使得2d空间反过来取消了3d空间.
编辑:只是让你知道:我还没有完全解决这个问题,目前我正在使用0.5px偏移,它似乎工作,但正如其他人所说,它不是"适当的"解决方案.所以我正在寻找真正的交易,钻石退出规则解决方案根本不起作用.
我相信它可能是显卡中的一个错误,但如果是这样,那么任何专业程序员都应该为此提供防弹解决方案,对吧?
编辑:我现在买了一张新的nvidia卡(以前有ATI卡),我仍然遇到这个问题.在很多很多游戏中我也看到了同样的错误.所以我想这是不可能以一种干净的方式修复?
这是错误的图像:

你是如何克服这个问题的?如果可能的话,最好是非着色器解决方案.当我自己绘制4条单独的线而不是使用线框模式时,我尝试设置第一条线的偏移量,但是效果不是很好:如果矩形大小改变了,它有时看起来很完美,但有时甚至比修复之前更糟糕.
这就是我渲染四边形的方式:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBegin(GL_QUADS);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glVertex2f(...);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
Run Code Online (Sandbox Code Playgroud)
是的,我知道我可以使用顶点数组或VBO,但这不是重点.
我也尝试过GL_LINE_LOOP,但它没有解决这个问题.
编辑:一个解决方案是,到目前为止:Lie Ryan的Opengl像素完美2D绘图:
请注意,OpenGL坐标空间没有整数概念,一切都是浮点数,OpenGL像素的"中心"实际上是0.5,0.5而不是左上角.因此,如果你想要从0,0到10,10(含)的1px宽线,你真的必须画一条从0.5,0.5到10.5,10.5的线.
如果你打开抗锯齿,这将是特别明显的,如果你有抗锯齿,并且你尝试从50,0到50,100绘制,你可能会看到模糊的2px宽线,因为线条落在两个像素之间.
我目前正在使用OpenGL编写科学成像应用程序.
我想知道当我的代码(C++/OpenGL和简单GLSL)在不同的硬件上执行时,OpenGL渲染(根据FBO检索到的像素)应该是完全确定的(ATI与NVidia,各种NVidia代和各种操作系统) )?
更确切地说,每次在任何硬件上运行我的代码(可以运行基本的GLSL和OpenGL 3.0)时,我都需要完全相同的像素缓冲区...
那可能吗?我应该考虑一些建议吗?
如果不可能,是否有一个特定品牌的视频卡(也许是Quadro?)可以在改变主机操作系统的同时做到这一点?
我想将像素直接写入屏幕(不使用顶点和多边形)。我调查了类似问题的各种答案,最引人注目的是这里和这里。
我看到有几种方法可以将像素绘制到屏幕上,但它们似乎都是间接的,并且使用了不必要的浮点运算:
GL_POINT为屏幕上的每个像素绘制一个。我试过这个并且它有效,但这似乎是一种在屏幕上绘制像素的低效方法。当我的数据将被转换为像素数据数组时,为什么要以浮点形式写入我的数据。
创建一个跨越整个屏幕的二维四边形并向其写入纹理。与第一个选项一样,这似乎是将像素放在屏幕上的一种迂回方式。纹理在放到屏幕上之前仍然需要经过光栅化。纹理也必须是方形的,而且大多数屏幕都不是方形的,所以我必须处理这个问题。
如何使用 OpenGL 以最直接、最有效的方式将颜色矩阵(其中pixels[0][0]对应于左上角和pixels[1920][1080]对应于右下角)显示在屏幕上?
直接写入帧缓冲区似乎是最有前途的选择,但我只看到人们使用帧缓冲区进行着色。
我正在使用OpenTK,我希望能够在Z是特定数字的情况下渲染多边形和纹理像素完美,投影中的任何其他位置都无关紧要(这适用于UI).有没有办法设置这样做的投影矩阵?