使用glDrawElements从VBO渲染有一个奇怪的结果

时间:2013-05-16 22:28:39

标签: opengl shader vbo librocket

我刚刚开始实现librocket(一个从HTML生成网格的UI库),一个要求是RenderInterface。 lib基本上发送你的类继承自RenderInterface生成的网格,并希望你保存网格然后它想要你渲染这个生成的网格。听起来不错,因为你有机会为第三方lib实现自己的渲染系统。但是我的问题可能与lib无关。

正如我告诉lib发送网格到我的班级:

GLuint m_BufferID[2];
//...
glGenBuffers(2, m_BufferID);
//..
glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);

当Lib向我发送网格时,这基本上就会发生。实际上它也会加载纹理等,但目前这并不重要。 (注意:data是一个指向ROCKET_LIB :: Vertex数组的指针)

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, position)); 
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, colour));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(ROCKET_CORE::Vertex), (GLvoid*)offsetof(Rocket::Core::Vertex, tex_coord)); 

glUniformMatrix4fv(0, 1, GL_FALSE, &m_TransMatrix[0][0]); 
glUniform2f(1, translation.x, translation.y);

glActiveTexture(GL_TEXTURE0);

glBindBuffer(GL_ARRAY_BUFFER, m_BufferID[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_BufferID[1]);

glDrawElements(GL_TRIANGLES, m_indices_count, GL_UNSIGNED_INT, NULL);

glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);

将网格物体上传到GPU后,我用高层代码渲​​染它。在这里完成这个问题是我的着色器:

顶点着色器:

#version 330

layout(location = 0) in vec2 inPosition;
layout(location = 1) in vec4 inColor;
layout(location = 2) in vec2 inTexCoord;

out vec4 fragColor;
out vec2 fragTexCoord;

layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;


void main()
{
    // Setting out values
    fragColor = inColor;
    fragTexCoord = inTexCoord;

    // Settings transformed position
    gl_Position = vec4(inPosition + m_Translation, 1.0f, 1.0f) * m_Ortho;
}

片段着色器:

#version 330

in vec4 fragColor;
in vec2 fragTexCoord;

out vec4 outColor;

layout (location = 2) uniform sampler2D m_TextureSampler;

void main()
{
    // Just for testing purpose show the text coord as color
    outColor = vec4(fragTexCoord, 0.0f, 1.0f);
}

哦,我只是用:

生成矩阵
glm::ortho(0.0f, static_cast<float>(m_Width), static_cast<float>(m_Height), 0.0f, -1.0f, 1.0f);

从DirectX我了解到你必须转置矩阵,我也在opengl中尝试过,但最后结果都很奇怪。这是一个屏幕截图,显示某些东西绝对不对。 (线框已激活) enter image description here

1 个答案:

答案 0 :(得分:1)

我不能说这肯定是你的实际问题,但 是一个问题:

#version 330

layout(location = 0) uniform mat4 m_Ortho;
layout(location = 1) uniform vec2 m_Translation;

这两件事情并没有结合在一起。 explicit assignment of uniform locations是OpenGL 4.3的一个功能。 GLSL版本3.30对应OpenGL 3.3。

现在,支持3.3的驱动程序可以公开该功能。但它将作为扩展而暴露。所以你需要activate it like an extension

#version 330
#extension ARB_explicit_uniform_location : require

显然,只有在此扩展可用时才会编译这些着色器。