Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 反向背面剔除不正确?_Opengl_Depth Buffer_Culling - Fatal编程技术网

Opengl 反向背面剔除不正确?

Opengl 反向背面剔除不正确?,opengl,depth-buffer,culling,Opengl,Depth Buffer,Culling,我已经尝试实现延迟渲染两周了。但我的测试程序中的所有网格都是反向剔除的。上面的代码应该是渲染模型的正确方法。我看到的每个例子都是这样绘制对象的。但当我使用GL_BACK作为剔除面时,结果如下: 这是GL_前线: GL_FRONT应该是我从GL_BACK期望的结果。奇怪的是,当我将glFrontFace设置为GL_CW时,一切都消失了。因此,这个问题与绕组无关。我花了一整天的时间搜索有关这方面的信息。我唯一发现的是深度缓冲区。但我看不出创作中有什么问题。正是因为这个问题,我无法正确地进行聚光灯

我已经尝试实现延迟渲染两周了。但我的测试程序中的所有网格都是反向剔除的。上面的代码应该是渲染模型的正确方法。我看到的每个例子都是这样绘制对象的。但当我使用GL_BACK作为剔除面时,结果如下:

这是GL_前线:

GL_FRONT应该是我从GL_BACK期望的结果。奇怪的是,当我将glFrontFace设置为GL_CW时,一切都消失了。因此,这个问题与绕组无关。我花了一整天的时间搜索有关这方面的信息。我唯一发现的是深度缓冲区。但我看不出创作中有什么问题。正是因为这个问题,我无法正确地进行聚光灯渲染的模具传递。我在几何过程中启用GL_深度_测试。这是我附加到fbo的深度缓冲区

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

主要问题是,有什么可能会导致反向背面剔除

您的投影矩阵将对确定发生这种情况的原因有很大帮助。基于卷绕顺序的剔除是在投影后进行的,例如,如果切换投影矩阵的利手,则必须反转卷绕方向以进行补偿(除其他外)。另外,这是一种糟糕的深度+模具格式,如果您不知道(24位的不可用空间),它是64位的,在旧的(D3D10之前)硬件上是不可能的。通常的本机深度+模具格式是什么?我其实没有太多关于它的信息。正如我所说,改变正面会让事情完全消失。后消隐给出了前消隐实际上应该给出的结果。我使用glm::perspective和正znear、zfar创建投影。我仍然看不出问题:最常见的深度+模具格式是24位深度+8位模具。这将打包到一个漂亮的32位缓冲区中。当您使用32位深度缓冲区和8位模具时,您将使用两倍的内存,因为硬件/驱动程序必须将所有内容对齐到二次方。在D3D10硬件上使用这种格式并不少见,但您应该知道,由于额外的不可用存储需求,这种格式比您预期的要慢得多。您选择的G-Buffer数据格式与此问题无关,但我想在早期指出此性能/可移植性问题。太糟糕了,问题不在于深度连接:/我遇到此问题是因为我认为我会更聪明,通过交换透视矩阵的y和z列来使用z-up坐标系。结果表明,这翻转了矩阵的惯用手。它还使纹理向后。
glGenRenderbuffers(1, &depthTexture);
glBindRenderbuffer(GL_RENDERBUFFER, depthTexture);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH32F_STENCIL8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthTexture);