【发布时间】:2020-06-14 14:49:31
【问题描述】:
我一直在用 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(),没有报错。
提前感谢您的帮助。
【问题讨论】:
-
感谢您的评论我刚刚发现了问题,我在着色器中使用 bg 作为常量,并在最终乘法中使用它,所以很多项都变为零,导致驱动程序优化,只留下 RGB1 作为有效值。这与 rt1 ans 相关联,因此它只有活动制服。如果我将 bg 作为统一传递,问题就解决了。感谢您的评论。
标签: c++ graphics opengl-es glsl opengl-es-2.0