2012-06-03 8 views
20

He leído un ejemplo de textura en OpenGL 2.1. El shader de fragmento es el siguiente:¿Qué almacena sampler2d?

#version 120 

uniform sampler2D texture; 
varying vec2 texcoord; 

void main(void) 
{ 
    gl_FragColor = texture2D(texture, texcoord); 
} 

la texcoord se transmite de vertex shader.

El siguiente código C++ renderizado se utiliza:

void render() 
{ 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, texture_id); 
    glUniform1i(unf_texture, 0); 
} 

Estoy confundido acerca de algunas cosas. Tengo algunas dudas:

  1. En fragment shader, la textura se pasa un valor cero (por glUniform1i). ¿El valor es realmente cero? ¿El valor es algo más?

  2. ¿Es realmente necesario el llamado glActiveTexture?

  3. ¿Por qué pasamos un valor cero en glUniform1i?

Respuesta

29

El sampler2D está vinculado a un texture unit. La llamada glUniforme lo vincula a la unidad de textura cero. La llamada glActiveTexture solo es necesaria si va a utilizar varias unidades de textura (porque GL_TEXTURE0 es el valor predeterminado de todos modos).

+24

Debería tener la costumbre de llamar siempre a 'glActiveTexture'. De esta forma, cuando de repente necesite usar más de una textura, no romperá el mundo. –

+0

para aclarar: ¿es correcto, por lo tanto, que cada textura (1D, 2D, 3D) que pueda vincularse bajo el mismo "GL_TEXTURE0", tenga que tener el mismo valor (0) pasado a sampler1D/2D/3D? y una textura asignada bajo "GL_TEXTURE1" requeriría que el valor 1 pasara al uniforme dentro del sombreador? – Chris

+1

@Chris Sí, eso es correcto. –

Cuestiones relacionadas