2012-05-11 102 views
1

我有一个问题,我的glsl 130代码不会在我的有些现代(ATI 5850)硬件上正常运行,而相同的代码在带有NVIDIA显卡的旧笔记本电脑上运行得非常好。这种情况没有问题我使用的是什么opengl上下文。会发生什么是矢量:in_position,in_colour和in_normal在新硬件上不能正确绑定。看来我被迫在较新的硬件上使用更新版本的glsl(330)。opengl 3.3+不与glsl 130代码兼容?

这里是顶点着色器的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

您的代码更有可能遇到允许您的不符合规范的代码正常工作的NVIDIA错误或导致符合规范代码失败的ATI错误。或两者。无论如何,你在哪里放置了用于绑定顶点属性的代码? –

+0

您可否详细说明'不绑定还是不完全'?那是什么意思?任何glGetErrors或着色器链接错误? – Tim

回答

1

你是否在glLinkProgram之前调用glBindAttribLocation?之后调用不会产生任何效果,因为只有在glLinkProgram期间才会为顶点属性分配索引。

在GLSL 3.30+有直接在GLSL代码specifiying属性索引的更好的办法:

layout(location=0) in vec4 in_position; 
layout(location=1) in vec4 in_colour; 
layout(location=2) in vec3 in_normal; 

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

+0

不,我在创建程序时首先调用glLinkProgram。我知道布局(位置= 0)等...我已经写了glsl 330代码,很好用。在这种情况下,我正在展示我编写的代码,以使我的应用程序与旧版硬件无法运行新版本的glsl兼容。该代码适用于旧版本,但不是较新版本。我感到困惑,因为我在印象之下,opengl是向后兼容的。不过,我发现在我的情况下,glsl 130代码可以在较旧的硬件上正常工作,但不是较新的硬件...... – kkuryllo

+0

那么这就是问题 - 您在glBindAttribLocation之前调用glLinkProgram。在glLinkProgram调用中分配顶点属性索引。如果你还没有调用glBindAttribLocation到那个点,那么属性将得到分配的任何索引是免费的 - 无论驱动程序/ GPU组合喜欢的任何顺序。 –

+0

非常感谢。通过移动那一行来修复我所有的代码:)我在线上学习了一个教程,就是这样做的。我刚刚意识到我的正常和顶点数据正在交换。有意义的,因为我看到我所有的多边形都被冲入中间的一个圆球。即从零开始恰好1个单位半径。 – kkuryllo