glUniform1i无效

时间:2019-01-25 14:04:48

标签: c++ opengl glsl opengl-3

我正在尝试将纹理单元0分配给sampler2D制服,但是制服的值没有改变。

我的程序正在根据其高程(Y坐标)为点着色。在纹理中查找它们的颜色。

这是我的顶点着色器代码:

#version 330 core

#define ELEVATION_MODE

layout (location = 0) in vec3 position;
layout (location = 1) in float intensity;

uniform mat4 vpMat;

flat out vec4 f_color;

#ifdef ELEVATION_MODE
    uniform sampler2D elevationTex;
#endif

#ifdef INTENSITY_MODE
    uniform sampler2D intensityTex;
#endif

// texCoords is the result of calculations done on vertex coords, I removed the calculation for clarity
vec4 elevationColor() {
    return vec4(textureLod(elevationTex, elevationTexCoords, 0), 1.0);
}

vec4 intensityColor() {
    return vec4(textureLod(elevationTex, intensityTexCoords, 0), 1.0);
}

int main() {
    gl_Position = vpMat * vec4(position.xyz, 1.0);


    #ifdef ELEVATION_MODE
        f_color = elevationColor();
    #endif

    #ifdef COLOR_LODDEPTH
        f_color = getNodeDepthColor();
    #endif
}

这是我的片段着色器:

#version 330 core

out vec4 color;

flat in vec4 f_color;

void main() {
    color = f_color;
}

执行此着色器时,我绑定了2个纹理:

  1. 纹理单元0中的高程纹理
  2. 纹理单元1中的强度纹理

我正在使用glUniform1i来设置制服的值:

glUniform1i(elevationTexLocation, (GLuint)0);

但是当我运行程序时,统一的elevationTex的值为1而不是0

如果我删除了glUniform1i调用,则统一值不会更改(仍为1),因此我认为该调用没有执行任何操作(但不会产生错误)。

如果我将制服的类型更改为float,而呼叫从glUniform1i更改为:

glUniform1f(elevationYexLocation, 15.0f);

统一中的值现在为15.0f。因此,在我的程序中,调用glUniform1i的位置没有问题,它对制服的价值没有影响。

关于我可能做错什么的任何想法吗?

我可以为您提供更多代码,但实际上并不能访问它,因此如果您知道没有它的答案,那就太好了。如果您需要代码的C ++部分,请询问,我将尝试检索重要部分

0 个答案:

没有答案