我遇到的问题是我的glsl 130代码在我的有点现代(ATI 5850)硬件上无法正常运行,而相同的代码在使用NVIDIA卡的旧笔记本电脑上运行完全正常..这是不是我使用什么opengl上下文。出现的是向量:in_position,in_colour和in_normal在新硬件上没有正确绑定。看来我被迫在更新的硬件上使用更新版本的glsl(330)。
这是顶点着色器的glsl代码。它相当简单和基本。
#version 130
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 normalMatrix;
in vec4 in_position;
in vec4 in_colour;
in vec3 in_normal;
out vec4 pass_colour;
smooth out vec3 vNormal;
void main()
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * in_position;
vec4 vRes = normalMatrix*vec4(in_normal, 0.0);
vNormal = vRes.xyz;
pass_colour = in_colour;
}
以下数据会发生什么:
in vec4 in_position;
in vec4 in_colour;
in vec3 in_normal;
不绑定或不完全绑定。这些值奇怪地扭曲了。从我的测试中,其他一切正常。将版本更改为330并使用location关键字可以解决问题,但这也会使代码与较旧的opengl版本不兼容......
以下是我用来指定这些位置的代码示例。
程序:
glBindAttribLocation(LD_standard_program, 0, "in_position");
glBindAttribLocation(LD_standard_program, 1, "in_colour");
glBindAttribLocation(LD_standard_program, 2, "in_normal");
以及后来的数据本身:
--- code to buffer vertex data
glEnableVertexAttribArray(0);
glVertexAttribPointer((GLuint) 0, 4, GL_FLOAT, GL_FALSE, 0, 0);
--- code to buffer colour data
glEnableVertexAttribArray(1);
glVertexAttribPointer((GLuint) 1, 4, GL_FLOAT, GL_FALSE, 0, 0);
--- code to buffer normal data
glEnableVertexAttribArray(2);
glVertexAttribPointer((GLuint) 2, 3, GL_FLOAT, GL_FALSE, 0, 0);
我的问题是:opengl不应该向后兼容吗?我开始担心我将不得不为单个版本的opengl编写单独的着色器以使我的程序在不同的硬件上运行...因为绑定这些属性是非常基本的功能我怀疑它是ATI实现中的一个错误...
答案 0 :(得分:1)
你是否在glLinkProgram之前调用glBindAttribLocation?调用后不会产生任何效果,因为顶点属性仅在glLinkProgram期间被赋予索引。
在GLSL 3.30+中,有更好的方法直接在GLSL代码中指定属性索引:
layout(location=0) in vec4 in_position;
layout(location=1) in vec4 in_colour;
layout(location=2) in vec3 in_normal;
编辑:哦,我已经跳过了你尝试过布局关键字的部分。