opengl-es-2.0 textures

opengl es 2.0 - OpenGLES 2: ¿cuándo glBindTexture y cuándo glActiveTexture?



opengl-es-2.0 textures (1)

Muy bien, entonces estas texturas realmente me confunden. He estado viendo this tutorial (que creo que es genial), particularmente la imagen titulada "Puedes definir hasta 32 Unidades de textura, pero solo hasta 8 texturas por sombreador". Como yo lo entiendo, así es como funciona:

Se activa una unidad de textura. Luego, une un objeto de textura (análogo a los cubos de ''Datos de textura'' en la imagen) a un determinado objetivo dentro de esa unidad. Entonces, glGenTextures para hacer los objetos y obtener sus nombres, y luego glBindTexture para enlazar esa textura a TEXTURE_2D o algo así (no estoy interesado en otros objetivos en este momento). A continuación, puede especificar los datos de textura con glTexImage2D.

Ahora. Estoy usando 3 programas de sombreado, cada uno con diferentes texturas requeridas. Esto es lo que quiero hacer:

En una etapa de inicialización, paso por cada una de mis unidades de textura, y voy

  • expresión activa
  • glBindTexture (opera en la unidad de textura activa)
  • glTexImage2D (opera en el objeto enlazado actualmente)

y para los sombreadores, me glUniform para hacer coincidir un uniforme en cada sombreado con el valor ''i'' especificado en GL_TEXTUREi de glActiveTexture. Necesito un total de solo cuatro texturas, y son bastante pequeñas.

Ahora, durante el renderizado, debería poder cambiar de programa bien, y todo funciona, ¿verdad? Cada programa ya tiene un uniforme que especifica qué unidad usar, y cada unidad ya tiene un objeto vinculado a su objetivo TEXTURE_2D, y cada objeto tiene datos especificados por glTexImage2D, ¿verdad? ¿Entonces no se requieren unidades de enlace o activación en mi función de render? Al menos así es como lo entendí, pero estoy dibujando las texturas equivocadas en los lugares equivocados.

Además, en uno de mis programas quiero cambiar entre tres texturas para una sola superficie. Así que pensé que cargué cada una de las texturas en un objeto, y vinculé cada uno de los objetos a una unidad, luego, en el momento del renderizado, puedo simplemente unir para indicar al programa qué unidad de textura usar.

Así que me pregunto si he entendido mal la estructura fundamental de la textura en OpenGL, o si los enlaces de objetos a unidades caducan cuando se cambian los programas, o algo así. O si tengo que enlazar una textura varias veces, pero ¿cuándo y por qué?


No te olvides de establecer glTexParameteri para cada objeto de textura.

void loadTextures() { GLint texture_object_handles[3]; glGenTextures(3, texture_object_handles); for (int i = 0 ; i < 3 ; ++i) { glActiveTexture(GL_TEXTURE0 + i); glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, ...); } return; } void draw() { // Draw three different materials without rebinding any textures. for (i = 0 ; i < 3 : ++i) { ... specify other uniforms and attributes glUniform1i(texture_location, i); ... glDrawElements(...); } return; }