저는 OpenGL에서 일부 응용 프로그램을 개발해 왔습니다. 첫 번째 단계에서는 FBO에 3 개의 색상 텍스처가 첨부 된 값을 씁니다. 두 번째 패스에서는이 세 텍스처를 쉐이더의 샘플러로 연결하고 색상에 대한 계산을 수행합니다. 다음은 두 번째 패스의 셰이더 코드입니다.glGetUniformLocation은 첫 번째 샘플러가 아닌 경우 -1을 반환합니다.
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을 반환하는 변수 수 있다는 것을 알고있다. 여기 분명히 최종 색상 계산에 모든 변수를 사용하고 있습니다.
-이 셰이더 코드에는 컴파일 타임이나 링크 오류가 없습니다. 다음
내가 오류를 glGetError의()를 넣어 시도하고 오류가 발생하지 않습니다이라면 .. 닥터 버크
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();``
어디서 코드입니다.
사전에 도움을 주셔서 감사합니다.
'RGB2'와 'RGB3'에 0.0을 곱합니다 ('bg = vec3 (0.0, 0.0, 0.0)'). 컴파일러는이를 최적화 할 수 있습니다. – Rabbid76
코멘트 주셔서 고마워요. 방금 쉐이더에서 상수로 bg를 사용하고 최종 곱셈에서이 용어를 사용하므로 문제가 발견되어 최적화 된 RGB1을 유효한 값으로 남겨 둡니다. 이것은 rt1 ans와 연관되어 있으므로 활성 유니폼 만 사용됩니다. bg를 유니폼으로 전달하면 문제가 해결됩니다. 의견을 주셔서 감사합니다. –