opengl 3.3+与glsl 130代码不兼容?

时间:2012-05-11 03:24:38

标签: opengl glsl backwards-compatibility vertex-shader

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

1 个答案:

答案 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;  

编辑:哦,我已经跳过了你尝试过布局关键字的部分。