Glgetuniform -location以外的采样器返回-1
glGetUniformLocation returns -1 for samplers other than first?
我一直在开发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,因为 rt2
和 rt3
不活动。
请注意,glGetUniformLocation
的第二个参数必须是 Active 统一变量的名称:
rt2
和rt3
设置RGB2
和RGB3
:
vec4 RGB2 = texture2D(rt2,vec2(gl_FragCoord.xy));
vec4 RGB3 = texture2D(rt3,vec2(gl_FragCoord.xy));
RGB2
和RGB3
乘以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;
这导致rt2
和rt3
在可执行代码中未使用,并且统一变量rt2
和rt3
是 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
的位置值不是错误条件,它仅表示不需要给定的统一。这可能出于多种原因发生,包括:
- 着色器中永远不存在统一价值。
- 声明均匀的值,但从未在着色器中使用。
- 在着色器/程序中声明并使用了统一值,但由编译器优化,因为编译器可以证明不需要该值。
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 如何使用采样器立方体作为数组
- 如何在Qt中设计异步包装器返回值?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 矩阵逆变器返回错误的反转
- 包装器返回promise c++
- 如何从高性能的输入迭代器返回变体?
- 如何为迭代器返回"null"值?
- 将迭代器返回到向量的函数
- 片段着色器中的"错误:在 GLSL 1.30 及更高版本中禁止使用非常量表达式索引的采样器数组"
- 为什么我的阶乘数查找器返回以C++输入的数字?(已编辑)
- 迭代器返回 vector::begin()
- 为什么找不到这个统一采样器2D?
- C++ grpc::experimental:interceptor 如何从自定义拦截器返回状态和消息
- 为什么 VS C++链接器返回具有混合 DLL 转发的"LNK2001: unresolved external symbol"?
- 如何将多个立方体纹理传递到均匀的采样器中
- GLSL 无法获取采样器3D 值
- 访问对向量以使用迭代器返回
- Glgetuniform -location以外的采样器返回-1
- R32I 采样器2D 始终返回 0