GLSL预3.30属性分配

时间:2014-06-02 13:29:57

标签: c++ opengl glsl

我正在为我目前无法访问的计算机编写代码,以便在更现代的笔记本电脑上进行测试。

将顶点和颜色信息(在交错数组中)传递给我正在使用的GPU

glBindBuffer (GL_ARRAY_BUFFER, VertexVBoid);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, sizeof(c_vertex), BUFFER_OFFSET(0));
glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, sizeof(c_vertex),       BUFFER_OFFSET(3*sizeof(vertex_store[0][0].x)));
glEnableVertexAttribArray (0);
glEnableVertexAttribArray (1);

顶点着色器是

void main()
{
gl_Position = ftransform();
gl_FrontColor = gl_Color;
}

片段着色器

void main(){
gl_FragColor=gl_Color;
}

绘制正确的形状但没有颜色 - 尝试尽可能使用“旧”版本的GLSL以确保向后兼容性。

那么如何在着色器中拾取颜色信息(我也传递正常信息)

1 个答案:

答案 0 :(得分:1)

您正在将固定函数顶点属性与通用顶点属性混合。

顶点着色器中的gl_Positiongl_Color属性对应于固定的函数属性。另一方面,glVertexAttribPointer()glEnableVertexAttribArray()调用用于通用顶点属性。在某些平台上混合使用这两个作品,但这不是一个安全可靠的事情。

您需要更改其中一个:

  • 在顶点着色器中使用通用属性。您可以通过声明自己的变量来实现,而不是使用gl_Positiongl_Color。您声明的变量在较旧的GL版本中具有attribute限定符,或者在当前核心配置文件中具有in限定符。您还需要将这些变量与属性位置相关联,如果您在使用至少GL 3.3时可以使用着色器代码中的layout(location = ..)限定符,或者在链接之前调用glBindAttribLocation()着色器。
  • 使用调用来设置固定功能顶点属性,而不是glVertexAttribPointer()glEnableVertexAttribArray()glVertexPointer()glColorPointer()glEnableClientState()