gpt4 book ai didi

c++ - 深度测试的奇怪结果

转载 作者:太空宇宙 更新时间:2023-11-04 11:38:33 26 4
gpt4 key购买 nike

我在渲染我的对象时启用 GL_DEPTH_TEST 时遇到问题,这是发生的情况:

enter image description here

GL_CULL_FACE 在那个上被禁用。

它只发生在透视图中!有没有人知道发生了什么事?

我为此使用 Qt 4.8。

当然,如果我禁用深度测试,它看起来不错,但对象会以错误的方式叠加,正如预期的那样。

更新

我用这个创建我的投影矩阵:

ProjectionMatrix.setToIdentity();
ProjectionMatrix.perspective(45, float(width) / float(height), 0, 20.0);

其中宽度和高度与视口(viewport)大小有关。

这是我绘制场景的代码:

void GLWidget::paintGL()
{
glClearColor(0.4765625, 0.54296875, 0.6171875, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

editor->setUniformValue("projectMatrix", controller->getProjectionMatrix());
editor->setUniformValue("viewMatrix", controller->getViewMatrix());

/** Dibujemos los grids **/
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
for (int i=0; i<3; i++)
{
if ((front && i==1) || (side && i==2) || (i==0))
{
editor->setUniformValue("modelMatrix", Objects.at(i).modelMatrix);
editor->setUniformValue("normalMatrix", Objects[i].getNormalMatrix());
editor->setUniformValue("texture", textureon);

glEnableClientState(GL_VERTEX_ARRAY);
editor->enableAttributeArray("vertices");
Objects[i].vertexbuffer->bind();
editor->setAttributeBuffer("vertices", GL_FLOAT, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
editor->enableAttributeArray("texuv");
Objects[i].uvbuffer->bind();
editor->setAttributeBuffer ("texuv", GL_FLOAT, 0, 2);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glEnableClientState(GL_NORMAL_ARRAY);
editor->enableAttributeArray("normals");
Objects[i].normalbuffer->bind();
editor->setAttributeBuffer ("normals", GL_FLOAT, 0, 3);
glDisableClientState(GL_NORMAL_ARRAY);

Objects[i].elementbuffer->bind();
glBindTexture(GL_TEXTURE_2D, Objects[i].texture);
glDrawElements(GL_TRIANGLES, Objects[i].indices.size(), GL_UNSIGNED_SHORT, (void*)0);
}
}

/** Ahora para las operaciones especificas de cada objeto **/
glEnable(GL_DEPTH_TEST);
//glEnable(GL_CULL_FACE);
for (int i=3; i<Objects.size(); i++)
{
//Objects[i].modelMatrix.scale(1.0, 1.0, 1.0);
//Objects[i].modelMatrix.rotate(1.0, 0.0, 1.0, 0.0);

editor->setUniformValue("modelMatrix", Objects.at(i).modelMatrix);
editor->setUniformValue("normalMatrix", Objects[i].getNormalMatrix());
editor->setUniformValue("texture", textureoff);
editor->setUniformValue("diffuseColor", Objects.at(i).diffuseColor);
editor->setUniformValue("shininess", Objects.at(i).shininess);
editor->setUniformValue("hardness", Objects.at(i).hardness);
editor->setUniformValue("LPos1", Objects.at(i).L1Pos);
editor->setUniformValue("LPos2", Objects.at(i).L2Pos);
editor->setUniformValue("LPos3", Objects.at(i).L3Pos);
editor->setUniformValue("LPos4", Objects.at(i).L4Pos);

glEnableClientState(GL_VERTEX_ARRAY);
editor->enableAttributeArray("vertices");
Objects[i].vertexbuffer->bind();
editor->setAttributeBuffer("vertices", GL_FLOAT, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);

glEnableClientState(GL_NORMAL_ARRAY);
editor->enableAttributeArray("normals");
Objects[i].normalbuffer->bind();
editor->setAttributeBuffer ("normals", GL_FLOAT, 0, 3);
glDisableClientState(GL_NORMAL_ARRAY);

Objects[i].elementbuffer->bind();
glDrawElements(GL_TRIANGLES, Objects[i].indices.size(), GL_UNSIGNED_SHORT, (void*)0);
}
}

简而言之,我首先根据相机的朝向绘制网格,以提供类似 Blender 的功能。然后,我绘制所有对象。我正在使用索引 VBO 来实现这一点。

我也在 CCW 中绘制它们,我 99% 确定三角形是以这种方式传递给 OpenGL 的。

最佳答案

[EDIT perspective] 投影矩阵的近值是零。这导致所有深度值在透视分割后都等于 1 (.xyz/.w)。 @Raxvan 显然有正确的想法。试试这个...

ProjectionMatrix.perspective(45, float(width) / float(height), 0.01, 20.0);

当然,对于大型场景,您需要较大的深度范围,但如果您将其设置得太大,您最终会遇到 z 冲突,其中不同距离的片段仍然具有相同的深度值,并且首先被光栅化的部分获胜(这似乎成为你遇到的问题)。我尽量让我的深度范围不超过 10,000 倍。

如果您有非常大的场景,您可能需要考虑其他方法。首先,使用更高精度的深度缓冲区。如果这还不够,也许可以使用两个投影矩阵并将场景分成近处和远处的物体。如果对象与边界相交,有时会导致问题。这是一些相关链接...

关于c++ - 深度测试的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com