Проблемы с многоструктурой OpenGl es 2.0 - PullRequest
1 голос
/ 31 марта 2020

Мне нужно загрузить две текстуры в шейдер, но при запуске приложения первая текстура отображается правильно, а вторая - просто черный квадрат

Загрузить текстуру

GLES20.glGenTextures(1, textures, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textures[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bmp, 0);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);

Активация текстур

GLES20.glEnableVertexAttribArray(ShaderProgram.posHandle);
GLES20.glEnableVertexAttribArray(ShaderProgram.texcordHandle);

GLES20.glVertexAttribPointer(ShaderProgram.posHandle,3, GLES20.GL_FLOAT, false, 0, vbuffer);
GLES20.glVertexAttribPointer(ShaderProgram.texcordHandle,2, GLES20.GL_FLOAT, false, 0, tbuffer);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture.getTexid());
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glUniform1i(ShaderProgram.texHandle, texture.getTexid());

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, blend.getTexid());
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
GLES20.glUniform1i(ShaderProgram.tex01Handle, blend.getTexid());

GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_BYTE, ibuffer);

Фрагмент шейдера

precision mediump float;
uniform sampler2D tex;
uniform sampler2D tx;
uniform vec4 u_color;
uniform float alpha;
varying vec2 v_tex;
void main(){
    vec4 t = texture2D(tex, v_tex);
    vec4 te = texture2D(tx, v_tex);
    gl_FragColor = te;
}

Первый сэмплер2D текс

Второй сэмплер2D TX

1 Ответ

1 голос
/ 31 марта 2020

glBindTexture привязывает текстуру к указанной цели в текущем текстурном блоке. Текущий текстурный блок является глобальным состоянием и выбирается с помощью glActiveTexture.
. Вы должны выбрать текстуру перед ее привязкой. Изменение единицы текстуры не влияет на текущие связанные текстуры:

# bind "texture" to texture unit 0
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture.getTexid());

# bind "blend" to texture unit 1
GLES20.glActiveTexture(GLES20.GL_TEXTURE1);    
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, blend.getTexid());

Кроме того, точка привязки между объектом текстуры и формой сэмплера текстуры является единицей текстуры. Таким образом, объект текстуры должен быть привязан к единице текстуры, а номер единицы текстуры должен быть присвоен униформе сэмплера текстуры (0 для GL_TEXTURE0, 1 для GL_TEXTURE1). например:

GLES20.glUniform1i(ShaderProgram.texHandle, 0);   // 0 means GL_TEXTURE0
GLES20.glUniform1i(ShaderProgram.tex01Handle, 1); // 1 means GL_TEXTURE1 
...