Glgetuniform -location以外的采样器返回-1

glGetUniformLocation returns -1 for samplers other than first?

本文关键字:采样器 返回 -location Glgetuniform      更新时间:2023-10-16

我一直在开发OpenGL中开发一些应用程序。在第一次通过时,我为我的FBO写了一些值,其中包含3个颜色纹理。在第二次通过中,我将这3个纹理连接为着色器中的采样器,并对颜色进行一些计算。以下是第二通过的着色器代码。

const char* final_fragment_source[] = {
    "uniform sampler2D rt1;n"
    "uniform sampler2D rt2;n"
    "uniform sampler2D rt3;n"
    "out vec4 color;n"
    "void main(){n"
    "vec3 bg = vec3(0.0, 0.0, 0.0);n"
    "vec4 RGB1 = texture2D(rt1,vec2(gl_FragCoord.xy));n"
    "vec4 RGB2 = texture2D(rt2,vec2(gl_FragCoord.xy));n"
    "vec4 RGB3 = texture2D(rt3,vec2(gl_FragCoord.xy));n"
    "vec3 tempcolor = RGB1.rgb -  bg * RGB1.a + bg * RGB3.a + bg * RGB2.rgb * RGB3.a + RGB3.rgb * RGB2.a * 0.0f + bg;n"
    "color = vec4(tempcolor,0.25);n"
    "} n"
};

问题是当我将RT2和RT3的GlgetuniformLocation()调用时,我得到-1。我得到了RT1的正确位置。

我尝试过

- 我知道,如果您不使用片段着色器中声明的任何统一变量,则驱动程序可以优化并返回-1为该变量。在这里很明显,我在计算最终颜色的计算中使用了所有变量。

- 此着色器代码中没有编译时间或链接错误。

以下是我获得错误

的代码
glUseProgram(fp_render_prog);
err = glGetError();
rt1 = glGetUniformLocation(fp_render_prog, "rt1");
err = glGetError();
rt2 = glGetUniformLocation(fp_render_prog, "rt2");
err = glGetError();
rt3 = glGetUniformLocation(fp_render_prog, "rt3");
err = glGetError();
MVPLocation = glGetUniformLocation(render_prog, "MVP");
err = glGetError();``

- 我尝试放置GlgetError(),并且没有任何错误。

感谢提前的任何帮助。

glGetUniformLocation(fp_render_prog, "rt2")glGetUniformLocation(fp_render_prog, "rt3")返回-1,因为 rt2rt3不活动。

请注意,glGetUniformLocation的第二个参数必须是 Active 统一变量的名称:

rt2rt3设置RGB2RGB3

vec4 RGB2 = texture2D(rt2,vec2(gl_FragCoord.xy));
vec4 RGB3 = texture2D(rt3,vec2(gl_FragCoord.xy));

RGB2RGB3乘以0.0:

vec3 bg = vec3(0.0, 0.0, 0.0);
vec3 tempcolor = 
    RGB1.rgb - 
    bg * RGB1.a +
    bg * RGB3.a +
    bg * RGB2.rgb * RGB3.a +
    RGB3.rgb * RGB2.a * 0.0f +
    bg;

编译器可以优化:

vec3 tempcolor = 
    RGB1.rgb - 
    vec3(0.0) * RGB1.a +
    vec3(0.0) * RGB3.a +
    vec3(0.0) * RGB2.rgb * RGB3.a +
    RGB3.rgb * RGB2.a * 0.0f +
    vec3(0.0);

最终与:

相同
vec3 tempcolor = RGB1.rgb;

这导致rt2rt3在可执行代码中未使用,并且统一变量rt2rt3 nem> intactive


请参阅[OpenGL ES 2规格-2.10.4阴暗变量-p。35](https://www.khronos.org/registry/opengl/specs/es/2.0/es_full_spec_2.0.pdf):

如果由编译器和链接器确定,当执行可执行代码时将实际访问该制服,则将其视为活动。如果编译器和连接器无法做出确定的确定,则统一将被视为活动。

.....

要在程序对象中找到 Active 均匀变量的位置,请使用命令

int GetUniformLocation( uint program, const char *name );


请参阅OpenGL ES 2.0在线手册页。-glGetActiveUniform

如果在链接执行过程中可以访问它可以访问的统一变量(内置或用户定义),则认为该变量是有效的。

-1的位置值不是错误条件,它仅表示不需要给定的统一。这可能出于多种原因发生,包括:

  • 着色器中永远不存在统一价值。
  • 声明均匀的值,但从未在着色器中使用。
  • 在着色器/程序中声明并使用了统一值,但由编译器优化,因为编译器可以证明不需要该值。