C++ GLSL 3.30之前的属性分配

C++ GLSL 3.30之前的属性分配,c++,opengl,glsl,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, s

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

将顶点和颜色信息(在交错数组中)传递到我正在使用的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;
}
片段着色器是

void main()
{
gl_Position = ftransform();
gl_FrontColor = gl_Color;
}
void main(){
gl_FragColor=gl_Color;
}
绘制正确的形状,但没有颜色-尽量使用“旧”版本的GLSL,以确保向后兼容性


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

您正在混合固定函数顶点属性和常规顶点属性

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

您需要更改其中一个:

  • 在顶点着色器中使用常规属性。您可以通过声明自己的变量来实现,而不是使用
    gl\u Position
    gl\u Color
    。您声明的变量在较旧的GL版本中具有
    属性
    限定符,或者在当前核心配置文件中具有
    限定符。您还需要将这些变量与属性位置关联,或者在着色器代码中使用
    layout(location=…)
    限定符(如果您至少可以使用GL 3.3),或者在链接着色器之前调用
    glBindAttribLocation()
  • 使用调用设置固定函数顶点属性,而不是
    glvertexattributepointer()
    glenableVertexattributeArray()
    glvertexinter()
    glColorPointer()
    glEnableClientState()

您需要阅读有关属性变量的信息。还有一件事:在旧的OpenGL上,您应该使用
glGetAttribLocation()
来获取属性位置,而不是使用这些
0
1
。作为旁注,可以提到属性索引0实际上保证别名
gl\u顶点
属性。但最好还是避免这样的事情。@derhass:我不认为这适用于所有的驱动程序/平台。可能有人会说,这些司机都坏了,但由于不太可能修好,所以不依赖它更安全。保证这种行为的语言有点模糊。可以肯定的是,在立即模式中指定通用顶点属性0相当于
glVertex{1 | 2 | 3 | 4}(…)
,因为它表示顶点的结束。这是否意味着通用顶点属性0必须别名为
gl\u顶点
,尚不清楚,但我所研究的每个gl实现似乎都是这样解释的。在历史上,通用属性0在ARB顶点程序汇编语言中别名为
位置
;NV即使在GLSL中也会使用全套ARBVP1别名,其他供应商则不会。