C ++:OpenGL正交深度

时间:2016-01-06 06:05:47

标签: c++ opengl depth-buffer

我遇到了一个杀了我的问题。我正在构建一个2D游戏(使用正交投影,所有数学都是用glm完成的)我正在使用渲染器在一次调用中绘制priveive(通过元素数组)。这是一个问题,因为事情按照给定的顺序绘制,而这不是我想要的。我尝试使用z坐标进行深度测试。当我启用深度测试时,它仍然不会以正确的顺序绘制它们,而是以相反的方式将第一个给予渲染器的方式放在顶部,其余的跟在它后面。

以下是一些代码:

// Vertex Shader
#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
uniform mat4 camera_matrix;
out vec4 fragment_color;
void main()
{
    gl_Position = camera_matrix * vec4(position, 1.0);
    fragment_color = color;
{

// Fragment Shader
#version 330 core
layout (location = 0) out vec4 color;
in vec4 fragment_color;
void main()
{
    color = fragment_color;
}

// Part of the rendering code
void render()
{
    window.clear();
    shader_program.begin();
    renderer.drawRectangle(vec2(0, 0),
                           vec2(100, 100),
                           vec4(1, 0, 0, 1),
                           1.0f); // depth value
    renderer.drawRectangle(vec2(50, 50),
                           vec2(100, 100),
                           vec4(0, 1, 0, 1),
                           -1.0f); // depth value
    shader_program.end();
    window.refresh();
}

// Renderer's code
void drawPolygon(const vec2* vertices, int count, const vec4& color, float depth)
{ // The drawRectangle just creates 4 vertices of the corners and passes them to this function
    int first = m_offset;
    m_vertices.emplace_back(vec3(vertices[0], depth), color);
    m_vertices.emplace_back(vec3(vertices[1], depth), color);
    m_offset += 2;
    for (int i = 2; i < count; i++)
    {
        m_vertices.emplace_back(vec3(vertices[i], depth), color);
        // Basically a triangle fan
        m_indices.emplace_back(first);
        m_indices.emplace_back(m_offset[1] - 1);
        m_indices.emplace_back(m_offset[1]++);
    }
}

// Draw call
void flush()
{
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * m_vertices.size(), m_vertices.data(), GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * m_indices.size(), m_indices.data(), GL_STATIC_DRAW);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    glBindVertexArray(m_vao);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
    glDrawElements(GL_TRIANGLES, m_indices.size(), GL_UNSIGNED_INT, nullptr);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

2016年1月6日更新: 在考虑了更多关于这个问题后,我认为它可能是我正在使用的窗口API(GLFW)所以我改变了我的窗口类以适应SDL2(这很容易,去模块化代码)并且问题仍然存在所以它归结为我的代码。

2 个答案:

答案 0 :(得分:2)

因此,在更深入地研究这个问题后,我忘了你可以&#34;调试&#34;通过检查值并在满足条件时输出特定颜色来着色。所以我改变了我的着色器以将位置传递给片段并测试了内置变量gl_FragDepth并且发现它没有被设置(这是显而易见的虽然我认为这是自动设置的,如果我是正确的我错误)。当用z-coord设置该值时,整个问题得到了修复。 这是更新的着色器:

// Vertex Shader
#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 color;

uniform mat4 camera_matrix = mat4(1.0);

out DATA
{
    vec3 position;
    vec3 color;
} fragment_out;

void main()
{
    gl_Position = camera_matrix * vec4(position, 1.0);
    fragment_out.position = position;
    fragment_out.color = color;
}

//Fragment Shader
#version 330 core

layout (location = 0) out vec4 color;

in DATA
{
    vec3 position;
    vec3 color;
} fragment_in;

void main()
{
    gl_FragDepth = fragment_in.position.z;
    color.rgb = fragment_in.color;
}

现在我可以恢复这个项目了

答案 1 :(得分:1)

我会将此作为评论,但没有足够的声誉。你使用过代码吗? glEnable(GL_DEPTH_TEST) 您的计划早期?如果没有这个,最后绘制的内容将会排在最前面。