【问题标题】:OpenGL Ubuntu DepthOpenGL Ubuntu 深度
【发布时间】:2017-06-09 04:26:03
【问题描述】:

我正在 Ubuntu 上编写一个简单的 OpenGL 程序,它使用顶点数组绘制两个正方形(一个在另一个前面)。出于某种原因, GL_DEPTH_TEST 似乎不起作用。后面的对象出现在前面的对象前面。深度缓冲区由

启用
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);

GL_DEPTH_TEST 由

启用
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;
}

片段着色器如下图所示: #版本 130

in vec4 color;
out vec4 fColor;

void main()
{
    fColor = color;
}

为什么前面的物体被后面的物体挡住了?

【问题讨论】:

  • 尽量简化。找到其他要删除的东西。我承认,你已经相当成功了。 (也许是着色器。)找到一些可行的东西,也许来自教程。双方相互合作。 IE。让教程更像你的代码,让你的代码更像教程。即使是“明显”的事情也要这样做。您也可以尝试在此处发布minimal reproducible example,您可以假设读者(例如我)已将 OpenGL、glew、glut 等安装为可用的库,但其他所有内容都需要在您发布的内容中和方便的形状(即一个代码引用,而不是几块。)
  • glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(sizeof(points))); minimal reproducible example,那么我可以自己找出答案,但您没有。”寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为,一个特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example。"
  • 另外,我不认为 GL_QUADS 是 khronos.org/registry/OpenGL-Refpages/gl4/html/… 的有效选项,但您也没有告诉我们您使用的是什么版本的 opengl...
  • 我不知道为什么这个问题被关闭了,这个错误很容易发现。您标记为“前”的内容实际上位于您标记为“后”的内容后面。我不知道您是如何得出应该相反的假设的,我只能猜测您将此与经典的左手 OpenGL 眼睛空间约定混淆了,其中“相机:朝向-z 方向 -但这在这里完全无关紧要,因为您根本没有建立眼睛空间,而是直接在剪辑空间中绘制。

标签: c ubuntu opengl


【解决方案1】:

在顶点着色器中,你做

in vec4 vPosition;
[....]
gl_Position = vPosition;

不应用任何转换。由于gl_Position 是顶点的剪辑空间位置,这意味着您的顶点坐标被解释为在剪辑空间中指定。

还有你的顶点坐标

vec4 vertices[8] =
{{0.0, 0.0, -0.25, 1.0},    // front
 [...]
 {0.25, 0.25, -0.75, 1.0},  // back

只是暗示您标记为“前”的点位于您标记为“后”的点之后。

我不知道您是如何得出相反的假设的,我只能猜测您将此与经典的左手 OpenGL 眼睛空间约定混淆了,其中“相机:查看 -z方向 - 但这在这里完全无关紧要,因为您根本没有建立眼睛空间,而是直接在剪辑空间中绘制。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2015-10-12
    • 2014-07-18
    相关资源
    最近更新 更多