Предположим, что я воспроизвожу видео на GLSurfaceView
с помощью специального средства визуализации, а в упомянутом рендерере я использую фрагментарный шейдер, который использует дополнительную текстуру для фильтрации поиска. Указанный фрагмент шейдер выглядит следующим образом:GLES20 Texturing - do glUniform1i (uniformLoc, txtUnit) до или после glActiveTexture() + glBindTexture()?
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;
uniform sampler2D inputImageTexture2;
varying highp vec2 v_TexCoordinate;
void main()
{
vec3 texel = texture2D(u_Texture, v_TexCoordinate).rgb;
texel = vec3(
texture2D(inputImageTexture2, vec2(texel.r, .16666)).r,
texture2D(inputImageTexture2, vec2(texel.g, .5)).g,
texture2D(inputImageTexture2, vec2(texel.b, .83333)).b
);
gl_FragColor = vec4(texel, 1.0);
}
В функции onDrawFrame()
после glUseProgram()
вызова, у меня есть функция, которая в основном onPreDrawFrame()
связывающейся текстурная в форму шейдера. В настоящее время она выглядит следующим образом:
public void onPreDrawFrame()
{
if (filterSourceTexture2 != -1 && filterInputTextureUniform2 != -1) {
GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, filterSourceTexture2);
GLES20.glUniform1i(filterInputTextureUniform2, 2);
}
}
filterSourceTexture2
является текстурным блоком, соответствующий дополнительной текстура.
Что я запутался в том, что если я ставлю glUniform1i()
вызов до glActiveTexture()
, он все еще работает хорошо, но большинство из учебников я видел поставить glUniform1i()
вызов, как приведенный выше код.
Итак, какой из них рекомендуется?