首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VBO与glDrawElements的渲染有一个奇怪的结果

VBO与glDrawElements的渲染有一个奇怪的结果
EN

Stack Overflow用户
提问于 2013-05-16 22:28:39
回答 1查看 495关注 0票数 1

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

正如我告诉过的那样,库向我的类发送网格:

代码语言:javascript
复制
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);

这基本上是发生在自由派给我的网格。实际上,它也加载纹理等,但这在目前来说并不重要。(注意:数据是指向ROCKET_LIB::Vertex数组的指针)

代码语言:javascript
复制
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之后,我用上面的代码渲染它。为了完成这个问题,这里是我的着色器:

顶点着色器:

代码语言:javascript
复制
#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;
}

片段着色器:

代码语言:javascript
复制
#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);
}

哦,我只是用以下方式生成矩阵:

代码语言:javascript
复制
glm::ortho(0.0f, static_cast<float>(m_Width), static_cast<float>(m_Height), 0.0f, -1.0f, 1.0f);

从DirectX中,我了解到必须转换矩阵,我也在opengl中尝试过,但是最后,这两个结果都很奇怪。这是一个截图,它显示了一些事情是绝对不正确的。(线框被激活)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 02:29:09

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

代码语言:javascript
复制
#version 330

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

这两件事不能结合在一起。均匀位置的显式分配是OpenGL 4.3的一个特性。GLSL版本3.30对应于OpenGL 3.3。

现在,具有3.3能力的驱动程序将公开这一特性。但它将作为一个延伸暴露出来。所以你需要它就像一个延伸

代码语言:javascript
复制
#version 330
#extension ARB_explicit_uniform_location : require

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16598556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档