OpenGL:深度缓冲向后工作,是否按缠绕顺序?

2024-06-28 20:46:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在使用opengl模型查看器,遇到了一个问题。当我渲染我的场景时,这些模型似乎被看穿了。我仔细研究了一下,觉得也许我的深度缓冲区不起作用,但我已经为它准备好了代码:

glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

深度缓冲器的测试

^{pr2}$

返回非0值(返回24)。所以我更深入地进行了测试,发现并不是深度缓冲不起作用,而是相反。它显示的是背面,而不是正面。如果我调用glCullFace(GL_FRONT),则模型的渲染正常。这很好,但它提出了一个为什么会发生的问题,我可能应该找到问题的根源。环顾四周,似乎我的缠绕顺序可能是问题所在,我为modelviewprojectionmatrix构建了自己的矩阵堆栈,我认为这可能是问题所在。如果我在摄影机向后移动20个单位的情况下渲染场景,水平fov为.785 rads,纵横比为1.333,clipplaneNear为1.000,clipplaneFar为30.000,我的矩阵如下所示:

model: 
[ 1 0 0 0 ]
[ 0 1 0 0 ]
[ 0 0 1 0 ]
[ 0 0 0 1 ]
view: 
[ 1   0   0   0 ]
[ 0   1   0   0 ]
[ 0   0   1   0 ]
[ 0   0   -20 1 ]
proj:  
[ 2.414214  0         0         0  ]
[ 0         -3.218951 0         0  ]
[ 0         0         -1.068966 -1 ]
[ 0         0         -2.068966 0  ]

当我把cullface放在前面时,它会按照我想要的方式进行渲染,对象在离摄影机20个单位的地方正确地渲染。我可以随意旋转和移动,一切正常。但是如果没有cullface深度是颠倒的,我的z值是不是搞错了?所有的东西看起来都和我目前使用的资源相似。如果不是这样,那么这个倒退的问题从何而来?在


Tags: 代码模型testbuffer场景bit单位矩阵
1条回答
网友
1楼 · 发布于 2024-06-28 20:46:30

我花了大约12个小时梳理了我所有的代码,并尽一切可能找出我出了什么问题。我把它缩小到投影矩阵,然后缩小到第二列第二行。我用this source来阅读投影矩阵,并手工计算,以找出它与我的值应该是什么,然后注意到了一个差异。3.21的值应该是正的而不是负的,这改变了我的深度值。我设法发现我正在使用的端口的库在移植时出错。库中有一个make_projection_fov函数,该函数将视野转换为上/下/右/左值,并称为make_projection函数。但是make_投影的参数是右左上下近远,make_投影_fov称之为右左下上近远。负面影响来自那里。在

这告诉我我真的需要检查一下我的图书馆。此后,我对所有库函数进行了测试,并在一些当前未使用的函数中发现了另一个错误。在

相关问题 更多 >