OpenGL-GLSL分配给可变变量会中断顶点定位

OpenGL-GLSL分配给可变变量会中断顶点定位,opengl,glsl,variable-assignment,varying,Opengl,Glsl,Variable Assignment,Varying,我曾经在OpenGL版本3.2中做过一个项目,我使用“sampler2DArray”来存储多个具有相同尺寸的图像,并使用纹理点进行渲染 现在我正在尝试将该项目移植到我的gnu/linux计算机上。此计算机最多只支持OpenGL版本2.1和GLSL版本1.20(不支持sampler2DArray)。据我所知,没有办法更新OpenGL以支持更新的功能 我目前正在尝试使用sampler3D来存储我的图像,并使用深度值来选择我想要的图像 为了将纹理深度从顶点着色器发送到片段着色器,我声明了一个“可变”浮

我曾经在OpenGL版本3.2中做过一个项目,我使用“sampler2DArray”来存储多个具有相同尺寸的图像,并使用纹理点进行渲染

现在我正在尝试将该项目移植到我的gnu/linux计算机上。此计算机最多只支持OpenGL版本2.1和GLSL版本1.20(不支持sampler2DArray)。据我所知,没有办法更新OpenGL以支持更新的功能

我目前正在尝试使用sampler3D来存储我的图像,并使用深度值来选择我想要的图像

为了将纹理深度从顶点着色器发送到片段着色器,我声明了一个“可变”浮点变量,该变量保存深度值(0.0到1.0)

我在以下位置渲染了4幅图像:(-0.5,+0.5),(+0.5,+0.5),(-0.5,-0.5)和(+0.5,-0.5)

图像切换方法似乎正在工作(更改“索引”变量会更改图像)。但由于某些原因,所有图像都在(0.0,0.0)处渲染,而不是在指定的位置。当我不指定包含纹理深度值的可变变量,并在片段着色器中将深度值设置为0.0时,这个问题就会消失

以下是顶点着色器:

#version 120

attribute vec2 position
attribute float index
varying float v_index

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    v_index = index; // Removing this assignment makes the images appear at their assigned locations.
}
以下是片段着色器:

#version 120

uniform sampler3D texture;
varying float v_index;

void main()
{
    gl_FragColor = texture3D(texture, vec3(gl_PointCoord, v_index));
}
我使用的结构表示顶点:

struct vertex {
    GLfloat x;
    GLfloat y;
    GLfloat texture_index;
};
调用
glvertexattributepointer
函数(问题可能也在这里):

我还发现了一个非常类似的问题。标记为“accepted”的答案声称问题的原因是着色器有超过16个不同的向量(我不是这样)


以下是链接:

这看起来您的属性位置Bing无效,并且位置是由GL分配的。如果没有赋值,则不会使用
索引
属性,并且只有
位置
一个是,因此它很可能得到位置0。当实际使用
索引时,可能会得到0(在nvidia上,这些位置似乎是按字母顺序分配的)


glBindAttribLocation()
调用仅在链接程序时有效,因此必须在
glLinkProgram()
之前调用这些调用,并且当您想要更改这些调用时,必须重新链接程序(您应该真正避免)。您给出的代码表明,这是在您的常规draw调用期间调用的,因此这些调用不会对链接的程序产生任何影响。

我将代码改为使用GLGetAttriblLocation,它可以正常工作。非常感谢。
glBindAttribLocation(shader_program, 0, "position");
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct vertex), (void *)0);
glBindAttribLocation(shader_program, 1, "index");
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, sizeof(struct vertex), (void *)(2 * sizeof(GLfloat));