C OpenGL Ubuntu深度
我正在Ubuntu上编写一个简单的OpenGL程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。出于某种原因,GL_深度_测试似乎不起作用。后面的对象显示在前面的对象的前面。深度缓冲区由启用C OpenGL Ubuntu深度,c,ubuntu,opengl,C,Ubuntu,Opengl,我正在Ubuntu上编写一个简单的OpenGL程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。出于某种原因,GL_深度_测试似乎不起作用。后面的对象显示在前面的对象的前面。深度缓冲区由启用 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glEnable(GL_DEPTH_TEST); GL_深度_测试由启用 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DE
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
GL_深度_测试由启用
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glEnable(GL_DEPTH_TEST);
深度缓冲区在绘制之前被清除
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
完整代码如下所示:
#define BUFFER_OFFSET( offset ) ((GLvoid*) (offset))
#define NUM_VERTICES 8
vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0}, // front
{0.0, 0.5, -0.25, 1.0},
{0.5, 0.5, -0.25, 1.0},
{0.5, 0.0, -0.25, 1.0},
{0.25, 0.25, -0.75, 1.0}, // back
{0.25, 0.75, -0.75, 1.0},
{0.75, 0.75, -0.75, 1.0},
{0.75, 0.25, -0.75, 1.0}};
vec4 vertex_colors[8] =
{{1.0, 0.0, 0.0, 1.0}, // red
{1.0, 0.0, 0.0, 1.0},
{1.0, 0.0, 0.0, 1.0},
{1.0, 0.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0}, // green
{0.0, 1.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0}};
void init(void)
{
GLuint program = initShader("vshader_td.glsl", "fshader_td.glsl");
glUseProgram(program);
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(vertex_colors), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(vertex_colors), vertex_colors);
GLuint vPosition = glGetAttribLocation(program, "vPosition");
glEnableVertexAttribArray(vPosition);
glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
GLuint vColor = glGetAttribLocation(program, "vColor");
glEnableVertexAttribArray(vColor);
glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points)));
glEnable(GL_DEPTH_TEST);
glClearColor(1.0, 1.0, 1.0, 1.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawArrays(GL_QUADS, 0, NUM_VERTICES);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(512, 512);
glutCreateWindow("Test Depth");
glewInit();
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
顶点着色器如下所示:
#版本130
in vec4 vPosition;
in vec4 vColor;
out vec4 color;
void main()
{
color = vColor;
gl_Position = vPosition;
}
in vec4 color;
out vec4 fColor;
void main()
{
fColor = color;
}
片段着色器如下所示:
#版本130
in vec4 vPosition;
in vec4 vColor;
out vec4 color;
void main()
{
color = vColor;
gl_Position = vPosition;
}
in vec4 color;
out vec4 fColor;
void main()
{
fColor = color;
}
为什么前面的对象会被后面的对象阻挡?在顶点着色器中,您会这样做 不应用任何转换。由于
gl_Position
是顶点的剪辑空间位置,这意味着您的顶点坐标被解释为在剪辑空间中指定
你的顶点坐标呢
只是暗示你标记为“前面”的点在你标记为“后面”的点后面
我不知道你怎么会认为应该是相反的,我只能猜你把这和经典的,左手OpenGL的眼睛空间惯例混淆了“摄影机:观察-z方向-但这在这里是完全不相关的,因为您根本没有建立眼睛空间,而是直接在剪辑空间中绘制。尝试简化。找到其他要移除的东西。我承认你已经相当成功了。(可能是着色器)从教程中找到一些有效的方法。双方都要互相努力。也就是说,让教程更像你的代码,让你的代码更像教程。即使是“显而易见”的事情也要这样做。您也可以尝试在此处发布,您可以假设读者(例如我)已将OpenGL、glew、glut等安装为可用的LIB,但其他所有符号都需要以您发布的格式和方便的形状(即一个代码引用,而不是几段)GLVERTEXAttributePointer(vColor,4,GL_FLOAT,GL_FALSE,0,BUFFER_OFFSET(sizeof(点));此外,我不认为GL_QUADS是一个有效的选项,但您也没有告诉我们您使用的opengl版本……我不知道这个问题为什么被解决了,错误很容易被发现。您标记为“前”的内容实际上位于您标记为“后”的内容后面我不知道你怎么会认为应该是相反的,我只能猜你把这和经典的,左手的OpenGL眼睛空间惯例混淆了“摄影机:观察
-z
方向-但这与此处完全无关,因为您根本没有建立眼睛空间,而是直接在剪辑空间中绘制。