我在场景中有一些物体,即使我指定物体A的y = 10(最高物体),从TOP相机我可以通过物体A看到底部物体。这是一张来自我的场景。
直到今天我才发现一个有趣的属性,画出模型顺序很重要,我可能错了。这是另一个图像,我改变了“ship1”的绘制顺序,注意:“ship1”是我的场景,如果我先ship1.draw();
,船会消失(正确),但如果我{{1}最后,他出现在最前面(不正确)。
编辑:我还将我的透视投影类与glm库进行了比较,以确保它不是我的投影矩阵的问题。一切都是正确的。
Edit1 :我的项目是git:Arkanoid git repository(windows,项目已准备好在安装了VS的任何计算机上运行)
Edit2 :我不使用法线或纹理。只是顶点和索引。
Edit3 :如果场景中的每个对象都使用(共享)来自同一文件的顶点,是否有问题?
Edit4 :我还更改了我的Perspective Projection值。我的飞机接近0.0f,现在我接近= 20.0f,远= 500.0f,角度=60º。但没有任何改变,观点确实如此,但深度不是。 = /
Edit5 :这是我的Vertex和Fragment着色器。
Edit6 :随时与我联系,我整天都在这里,所以问我什么。目前我正在从零开始重写所有项目。我有两个立方体呈现良好,一个在另一个前面。已经添加了我的类:相机,投影,着色器处理程序。移动到创建和绘制对象的类。
ship1.draw();
一些代码:
// 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;
}
答案 0 :(得分:7)
我已经克隆了您已链接的存储库,以查看问题是否位于其他位置。在您最近的版本中,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.
最后一行在绘制每个对象后清除深度缓冲区,这意味着绘制的下一个对象未正确遮挡。你应该每帧只清除一次深度缓冲区。