GLSL 3.30之前的属性分配

GLSL pre 3.30 attribute allocation

本文关键字:属性 分配 GLSL      更新时间:2023-10-16

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

将顶点和颜色信息(在交错数组中)传递给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;
}

fragment shader is

void main(){
gl_FragColor=gl_Color;
}

绘制了正确的形状,但没有颜色-试图尽可能使用"旧"版本的GLSL以确保向后兼容。

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

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

顶点着色器中的gl_Positiongl_Color属性对应于固定函数属性。另一方面,glVertexAttribPointer()glEnableVertexAttribArray()调用是针对一般顶点属性的。在某些平台上混合使用这两种方法是可行的,但这并不是一种安全可靠的方法。

您需要更改其中一个:

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