2010-05-06 15 views

Respuesta

13

El estado GL para los enlaces es un nombre de textura por objetivo (es decir, 1D/2D/3D/cubo). Por lo tanto, al llamar a

glBindTexture(GL_TEXTURE_2D, my2dTex) 
glBindTexture(GL_TEXTURE_1D, my1dTex) 

, el GL recordará ambas configuraciones.

Ahora, la respuesta de que un GL utilizará depende de si tiene un sombreador activado.

Si hay un sombreador activado, el GL usará lo que sea que el sombreador indique usar. (basado en sampler1d/sampler2d ...).

Si no hay sombreado activado, entonces primero depende de qué glEnable se haya realizado.

glEnable(GL_TEXTURE_2D) 
glEnable(GL_TEXTURE_1D) 

Si tanto están activados, hay una regla de prioridad estática en la especificación (3.8.15 la aplicación de texturas en la especificación GL 1.5).

Cube > 3D > 2D > 1D 

Así, en su caso, si se habilitan tanto sus objetivos textura, se utilizará el 2D.

Como nota al margen, observe cómo un shader no le importa si o no el objetivo de la textura es Habilitado ...

Editar para añadir:

Y para las personas que realmente quieren conseguir a los detalles arenosos, siempre tienen una textura vinculada a cada objetivo * de cada unidad. El nombre 0 (el predeterminado para el estado de enlace) corresponde a una serie de objetos de textura, uno por objetivo. glBindTexture(GL_TEXTURE_2D, 0) y glBindTexture(GL_TEXTURE_1D, 0) ambos enlazan una textura, pero no la misma ...

Esto es histórico, especificado para coincidir con el comportamiento de GL 1.0, donde los objetos de textura aún no existían. Sin embargo, no estoy seguro de lo que la obsolescencia en GL3.0 hizo con esto.

0

Creo que se dibujará la textura 1d. Hasta donde yo sé, cada unidad de textura puede tener solo una textura ligada a la vez. La cantidad de dimensiones de la textura realmente no entra.

Tener más de una textura con destino tiene que activar más de una unidad de textura (usando glActiveTexture), así:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, my2dTex); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_1D, my1dTex); 

Esto viene de mi conocimiento de OpenGL 2.1, sin embargo, así que por favor me corrija si ¡han introducido una nueva y elegante extensión de textura en una versión posterior!

+0

Lo siento, piensas mal. Bahbar proporciona la respuesta correcta. – Thomas

+0

Bueno, hoy aprendí algo nuevo. ¡Eso me enseñará a responder cuando no tengo mi libro de OpenGL a mano! –

0

La textura aplicada es la última especificada con la rutina BindTexture.

partir de la especificación:

El nuevo objeto textura unido a objetivo, y se mantiene una textura de la dimensionalidad y tipo especificado por objetivo hasta que se suprime. .... Si el enlace es correcto, no se realiza ningún cambio en el estado del objeto de textura enlazado, y , cualquier enlace anterior al objetivo se ha roto.

De hecho, en su ejemplo se aplicará la textura 1D, ya que "sobrescribe" el estado de la unidad de textura activa.

+1

la palabra objetivo aquí se refiere a _1D o _2D. hay 2 objetivos diferentes involucrados en este caso. – Bahbar

+1

'GL_TEXTURE_1D' y' GL_TEXTURE_2D' son objetivos diferentes. – Thomas

+0

Ok, lo tengo * después * de leer la respuesta de Bahbar (¡se perdió antes de editar!). Buen punto. Olvidando siempre el paradigma Habilitar/Deshabilitar ya que siempre usa el lenguaje de sombreado ... – Luca

Cuestiones relacionadas