【问题标题】:OpenGL - GLSL assigning to varying variable breaks the vertex positioningOpenGL - 分配给可变变量的 GLSL 会破坏顶点定位
【发布时间】:2014-08-20 02:11:18
【问题描述】:

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

现在我正在尝试将该项目移植到我的 gnu/linux 计算机上。此计算机仅支持最高 2.1 的 OpenGL 版本和最高 1.20 的 GLSL 版本(没有 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;
};

glVertexAttribPointer 函数的调用(问题可能也在这里):

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));

我也发现了一个非常相似的问题。标记为“已接受”的答案声称问题的原因是着色器有超过 16 个不同的向量(对我来说不是这种情况)。

这里是链接:Strange error in GLSL while assigning attribute to a varying in vertex shader

【问题讨论】:

    标签: opengl glsl variable-assignment varying


    【解决方案1】:

    这看起来您的属性位置 bing 无效,并且位置是由 GL 分配的。如果没有赋值,index 属性不会被使用,只有position 一个是,所以它很可能得到位置 0。如果实际使用index,它可能会得到 0(在 nvidia 上,那些位置似乎是按字母顺序分配的)。

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

    【讨论】:

    • 我将代码更改为使用 glGetAttribLocation 并且它可以工作。谢谢!
    猜你喜欢
    • 2019-01-09
    • 2021-12-18
    • 2015-03-01
    • 2012-07-24
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多