我的场景中有一些对象,即使我指定对象 A 的 y= 10(最高的对象),从顶部摄像机我也可以通过对象 A 看到底部对象。这是我场景中的图像。
直到今天我才发现一个有趣的属性,模型的绘制顺序很重要,我可能是错的。这是另一张图像,我更改了“ship1”的绘制顺序,注意:“ship1”远远低于我的场景,如果我这样做的话ship1.draw();
首先,船消失了(正确),但如果我这样做ship1.draw();
最后,他出现在顶部(不正确)。
Video:
- Q1) 抽签顺序总是很重要吗?
- Q2)如何解决这个问题,每次更改相机位置时都应该更改绘制顺序吗?
Edit:我还将我的透视投影类与 glm 库进行了比较,只是为了确保这不是我的投影矩阵的问题。一切都是正确的。
Edit1:我在 git 上有我的项目:打砖块 git 存储库 https://github.com/RareFever/Arkanoid.git(Windows,项目可以在任何安装了VS的计算机上运行)
Edit2:我不使用法线或纹理。只是顶点和索引。
Edit3:如果场景中的每个对象都使用(共享)同一文件中的顶点,是否有问题?
Edit4:我还更改了透视投影值。我的近平面为 0.0f,现在近=20.0f,远=500.0f,角度=60°。但什么都没有改变,视野改变了,但深度没有改变。 =/
Edit5:这是我的顶点和片段着色器。
Edit6:随时联系我,我整天都在这里,有什么问题都可以问我。目前我正在从零重写所有项目。我有两个渲染良好的立方体,一个在另一个前面。已经添加了我的类:相机、投影、着色器处理程序。转到创建和绘制对象的类。
// 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);
}