2

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

4

1 回答 1

1

你是在 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;  

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

于 2012-05-11T04:09:59.737 回答