问题描述
我有一个非常简单的程序,可以在OpenGL中显示3D三角形。我输入的帽子价值,无法正确显示。我将以下数组放入顶点缓冲区
float triangle[] = {
// x y z r g b a
0.2f,-0.2f,-0.5f,0.0f,1.0f,0.2f,1.0f
};
然后我将以下内容传递给顶点着色器
glEnabLevertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(float) * 7,0);
glEnabLevertexAttribArray(1);
glVertexAttribPointer(1,4,0);
但是,即使位置正确,输出三角形也有一个奇怪的蓝色区域,这没有意义,因为输入颜色应为黑色。我已经看到一些将索引用作sizeof(float)* 3和sizeof(float)* 4,但这会使三角形变成绿色,并使位置错误。 docs.gl条目含糊不清,没有提供任何示例。这是我的着色器
片段着色器
#version 330 core
out vec4 color;
in vec4 outColor;
void main() {
out vec4 outColor;
uniform mat4 transform;
void main() {
gl_Position = transform * inPos;
outColor = inColor;
};
这是怎么了?
解决方法
如果绑定了命名的缓冲区对象,则glVertexAttribPointer
的最后一个参数将被视为缓冲区数据存储区中的字节偏移。
color属性的偏移量为3*sizeof(float)
个字节:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,sizeof(float) * 7,0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1,4,(void*)(sizeof(float) * 3)); // <--- byte offset
该属性包含7个组成部分( x , y , z , r , g , b , a )。顶点坐标的偏移为0,因为这是元组中的前3个分量。颜色的偏移量为3*sizeof(float)
,因为这是从4到7的分量。