¿Cómo puedo leer desde múltiples texturas en un sombreador OpenGL ES 2?

¿Cómo puedo habilitar más de una textura en OpenGL ES 2 para poder tomar muestras de todas ellas en mi sombreador? Por ejemplo, estoy tratando de leer dos texturas diferentes en mi sombreador para el automobile del jugador.

Así es como actualmente estoy lidiando con la textura de mi auto:

glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, this->texture2DObj); glUniform1i(1, 0); glBindBuffer(GL_ARRAY_BUFFER, this->vertexBuffer); glEnableVertexAttribArray(0); int offset = 0; glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, this->vertexBufferSize,(const void *)offset); offset += 3 * sizeof(GLfloat); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, this->vertexBufferSize, (const void*)offset); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->indexBuffer); glDrawElements(GL_TRIANGLES, this->indexBufferSize, GL_UNSIGNED_SHORT, 0); glDisableVertexAttribArray(0); glDisableVertexAttribArray(1); 

En resumen, quieres un código como este:

 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, this->texture2DObj); glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, this->otherTexture2DObj); GLint samplerArrayLoc = glGetUniformLocation(shaderObject, "texture"); const GLint samplers[2] = {0,1}; // we've bound our textures in textures 0 and 1. glUniform1iv( samplerArrayLoc, 2, samplers ); 

Une sus texturas en dos ranuras de textura diferentes (en este caso, GL_TEXTURE0 y GL_TEXTURE1), luego configure sus uniformes de sombreado para indicarle al sombreador qué ranuras de textura usar para sus búsquedas de textura.

En este código, supongo que su sombreador recibirá estos muestreadores como uniform sampler2D texture[2]; Alternativamente, puede tenerlos como variables uniformes separadas en lugar de una única matriz uniforme, en cuyo caso establecería sus valores por separado, en lugar de hacerlo en una sola llamada.

Luego, su sombreador puede leer ya sea de la texture[0] o de la texture[1] para get una muestra de cualquiera de las dos texturas.

¡Y eso es todo lo que hay que hacer!

Necesitas consultar primero las ubicaciones uniformes de la muestra con glGetUniformLocation , luego establecer la muestra en la misma unidad de textura que has habilitado con glActiveTexture . Por lo tanto, algún código de muestra para esto se vería así:

 mySamplerLoc = glGetUniformLocation(programId, "mySampler"); ... glUniform1i(mySamplerLoc, 0); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureId); 

Y repítalo para las texturas que quieras, reemplazando el 0 y GL_TEXTURE0 por la unidad de textura correspondiente a la que deseas unir la textura.

Y de cource, asegúrese de agregar las declaraciones de variables uniformes en el sombreador:

 uniform sampler2D mySampler; void main() { vec4 color = texture(mySampler, texCoords); ... } 

Teniendo en count que debes evitar consultar las ubicaciones uniformes del sombreador todo el time. Lo ideal es consultarlos una vez con glGetUniformLocation () y almacenar el resultado para su uso posterior.