C++ 绘制顺序是否影响对象的深度位置?(包括图片)
我在场景中有几个对象,即使我指定对象a的y=10(最高的对象),从顶部摄影机我可以通过对象a看到底部对象。这是我场景中的图像 直到今天,我才发现了一个有趣的属性,它可以绘制模型的顺序,我可能错了。这里是另一张图片,我改变了“ship1”的绘制顺序,注意:如果我做C++ 绘制顺序是否影响对象的深度位置?(包括图片),c++,opengl,shader,draw,C++,Opengl,Shader,Draw,我在场景中有几个对象,即使我指定对象a的y=10(最高的对象),从顶部摄影机我可以通过对象a看到底部对象。这是我场景中的图像 直到今天,我才发现了一个有趣的属性,它可以绘制模型的顺序,我可能错了。这里是另一张图片,我改变了“ship1”的绘制顺序,注意:如果我做ship1.draw()首先,飞船消失(正确),但如果我这样做ship1.draw()在最后,他出现在顶部(不正确) 视频: Q1)提款顺序是否始终重要 问题2)如何解决此问题,我是否应该在每次更改相机位置时更改绘图顺序 编辑:我
ship1.draw()代码>首先,飞船消失(正确),但如果我这样做ship1.draw()代码>在最后,他出现在顶部(不正确)
视频:
- Q1)提款顺序是否始终重要李>
- 问题2)如何解决此问题,我是否应该在每次更改相机位置时更改绘图顺序李>
编辑:我还将我的透视投影类与glm库进行了比较,以确保投影矩阵没有问题。一切都是正确的
Edit1:我在git上有我的项目:(windows,项目可以在任何安装了VS的计算机上运行)
Edit2:我不使用法线或纹理。只是顶点和索引
Edit3:如果场景中的每个对象都使用(共享)同一文件中的顶点,是否存在问题
Edit4:我还更改了透视投影值。我在0.0f下有一个近平面,现在我有近=20.0f和远=500.0f,角度=60º。但一切都不会改变,视图会改变,但深度不会改变=/
Edit5:这是我的顶点和片段着色器
Edit6:随时与我联系,我整天都在这里,所以问我任何问题。目前,我正在重写从零开始的所有项目。我有两个立方体,一个在另一个前面,呈现得很好。已经为添加了mine类:摄影机、投影、着色器处理程序。移动到创建和绘制对象的类
// Vertex shader
in vec4 in_Position;
out vec4 color;
uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;
void main(void)
{
color = in_Position;
gl_Position = Projection * View * Model * in_Position;
}
// Fragment shader
#version 330 core
in vec4 color;
out vec4 out_Color;
void main(void)
{
out_Color = color;
}
一些代码:
void setupOpenGL() {
std::cerr << "CONTEXT: OpenGL v" << glGetString(GL_VERSION) << std::endl;
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glDepthMask(GL_TRUE);
glDepthRange(0.0, 1.0);
glClearDepth(1.0);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
}
void display()
{
++FrameCount;
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
renderScene();
glutSwapBuffers();
}
void renderScene()
{
wallNorth.draw(shader);
obstacle1.draw(shader);
wallEast.draw(shader);
wallWest.draw(shader);
ship1.draw(shader);
plane.draw(shader);
}
void setupOpenGL(){
std::cerr我已克隆了您链接的存储库,以查看问题是否位于其他地方。在您的最新版本中,Object3D::draw函数如下所示:
glBindVertexArray(this->vaoID);
glUseProgram(shader.getProgramID());
glUniformMatrix4fv(this->currentshader.getUniformID_Model(), 1, GL_TRUE, this->currentMatrix.getMatrix()); // PPmat é matriz identidade
glDrawElements(GL_TRIANGLES, 40, GL_UNSIGNED_INT, (GLvoid*)0);
glBindVertexArray(0);
glUseProgram(0);
glClear( GL_DEPTH_BUFFER_BIT); <<< clears the current depth buffer.
glBindVertexArray(this->vaoID);
glUseProgram(shader.getProgramID());
glUniformMatrix4fv(this->currentshader.getUniformID_Model(),1,GL_TRUE,this->currentMatrix.getMatrix());//PPmatématriz identidade
gld元素(GL_三角形,40,GL_无符号整数,(GLvoid*)0);
glBindVertexArray(0);
glUseProgram(0);
glClear(GL_DEPTH_BUFFER_BIT);您是否有深度缓冲区?启用了深度测试?您通过在传递给glutInitDisplayMode()的标志中包含GLUT_DEPTH
来请求深度缓冲区
?不确定问题出在哪里。最常见的问题是没有深度缓冲区/测试,或者没有深度范围(远近比)的投影矩阵这太大了。你的近剪裁平面和远剪裁平面是什么?如果你使用可编程顶点或碎片着色器,你可能需要确保它们正确处理深度值。我还建议使用GL\u LESS
进行深度测试,而不是GL\u LEQUAL
进行后期绘制顺序(当两个对象具有相同深度时)GL_LEQUAL在多次为同一个曲面着色时可能很有用,例如贴花或多次光照。但在这种情况下,使用GL_LESS可能是个好主意。@n0rd如果深度相等,绘制顺序对两个比较函数都很重要。只是对于GL_LESS
,第一个获胜,对于GL_LEQUAL
>最后一个赢了。谢谢!多么简单的错误。这个错误发生在哪里,是glGetError()的结果吗?在它之前发生了哪个操作?