我刚刚开始实现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中尝试过,但最后结果都很奇怪。这是一个屏幕截图,显示某些东西绝对不对。 (线框已激活)
答案 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
显然,只有在此扩展可用时才会编译这些着色器。