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

opengl 3.3+;与glsl 130代码不兼容?,opengl,glsl,backwards-compatibility,vertex-shader,Opengl,Glsl,Backwards Compatibility,Vertex Shader,我遇到了一个问题,我的glsl 130代码无法在我有点现代的(ATI 5850)硬件上正常运行,而相同的代码在我有NVIDIA卡的旧笔记本电脑上运行得非常好。。无论我使用什么opengl上下文,情况都是如此。出现的是向量:在新硬件上,处于\u位置、处于\u颜色和处于\u法线没有正确绑定。似乎我被迫在较新的硬件上安装较新版本的glsl(330) 以下是顶点着色器的glsl代码。它相当简单和基本 #version 130 uniform mat4 projectionMatrix; uniform

我遇到了一个问题,我的glsl 130代码无法在我有点现代的(ATI 5850)硬件上正常运行,而相同的代码在我有NVIDIA卡的旧笔记本电脑上运行得非常好。。无论我使用什么opengl上下文,情况都是如此。出现的是向量:在新硬件上,处于\u位置、处于\u颜色和处于\u法线没有正确绑定。似乎我被迫在较新的硬件上安装较新版本的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实现中的一个缺陷…

您是在glLinkProgram之前调用glBindAttribLocation吗?调用after不会产生任何效果,因为顶点属性仅在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;  

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

您的代码更可能遇到NVIDIA错误,该错误允许您的非一致性代码工作,或者是ATI错误导致您的一致性代码失败。或者两者兼而有之。无论如何,你把绑定顶点属性的代码放在哪里了?你能详细说明一下“不绑定或不完全绑定”吗?这是什么意思?任何glGetErrors或着色器链接错误?否,我在创建程序时首先调用glLinkProgram。我知道布局(位置=0)等。。。我已经编写了GLSL330代码,效果非常好。在本例中,我展示了我编写的代码,以使我的应用程序与无法运行较新版本glsl的旧硬件兼容。该代码适用于旧版本,但不适用于新版本。我感到困惑,因为我觉得opengl是向后兼容的。然而,在我的例子中,我发现glsl 130代码在较旧但不是较新的硬件上运行良好……这就是问题所在——在glBindAttribLocation之前调用glLinkProgram。顶点属性索引在glLinkProgram调用中分配。若你们还并没有调用GLBindAttriblLocation,那个么该属性将被分配任何免费的索引——以驱动程序/gpu组合喜欢的任何顺序。非常感谢。只需移动一行代码就可以修复我所有的代码:)我在网上学习了一个教程,就是这样做的。我刚刚意识到我的法线和顶点数据正在交换。这是有道理的,因为我看到我所有的多边形都在中心变成了一个球形。i、 e.距零正好1个单位半径。