我遇到了一个问题,即我的 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 实现中的错误...