2010-09-03 21 views
7

CORREGIDO al establecer cerca del plano de recorte en 1, en lugar de en 0 (no estoy seguro de por qué fue así para empezar). Consulte la pregunta sobre el código de esqueleto y la respuesta de Adrián sobre cómo y por qué funciona.Proyectar una textura en OpenGL

Tengo algunas posiciones de cámara diferentes, y mi escena consiste en un solo quad.

El quad es tal que se proyecta exactamente en la ventana/ventana en el primer fotograma. Quiero proyectar una textura desde la posición de esta cámara en el patio. La textura también cubre la ventana gráfica exactamente.

Lo primero que hice fue

// GL_QUADS... 
    glTexCoord2f(/*one corner of s,t space*/); 
    glVertex3f(/* appropriate vertex */);; 

y terminó con algo como (foto no la mía)

Y entonces me di cuenta de que sí, por supuesto, tiene que ser un proyectiva transformación. De acuerdo con these notes:

  1. A modelview transform para orientar la proyección en la escena.
  2. Transformación proyectiva (perspectiva u ortogonal).
  3. Una escala y un sesgo para asignar el plano de recorte cercano a las coordenadas de textura.

Ahora que funciona, he aquí una aplicación aproximada del código:

// in init code 
glEnable(GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); 

double ratio = width/height; 

// set up FROM modelview matrix 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 


gluPerspective(pcam._fov/ratio, ratio, 1, far_z); 
gluLookAt(/* FROM camera's parameters */); 

glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); //S, T, R and Q 
GLfloat Splane[] = {1.f, 0.f, 0.f, 0.f}; //S, T, R and Q, diagonal 
glTexGenfv(GL_S,GL_EYE_PLANE,Splane); //S, T, R and Q 

// -- load and bind texture -- 

glEnable(GL_TEXTURE_GEN_S); //S, T, R and Q 

// scale and bias 
glMatrixMode(GL_TEXTURE); 
glPushMatrix(); 
glLoadIdentity(); 
glTranslatef(0.5,0.5,0.0); 
glScalef(0.5,0.5,1); 

gluPerspective(cam._fov/ratio, ratio, 1, far_z); 
gluLookAt(/* TO camera's parameters */); 

glBegin(GL_QUADS); 
    glVertex3f(/* for each vertex */); 
glEnd(); 
glDisable(GL_TEXTURE_GEN_S); //S, T, R and Q 
+0

Creo que puede confundir sus cámaras TO y FROM. ¿FROM/pcam es el proyector? GL_TEXTURE debe contener las transformaciones para el proyector en lugar de la cámara de visualización. Sin embargo, no sé si eso resolvería tu problema. –

+0

Sí, es el proyector. Estoy seguro de que estoy proporcionando los detalles correctamente. Incluso si cambio las llamadas de perspectiva/lookat para que ambas utilicen los mismos detalles de la cámara, se ve mal ... – CakeMaster

+0

¿Ambas cámaras comparten los mismos parámetros * exactos? Orientación, posición y vista del tronco: en el momento en que surge el problema ? ¿Por qué está configurando la * vista * de acuerdo con el proyector y las coordenadas de la textura de acuerdo con la cámara de visualización? De lo contrario, las transformaciones y los coeficientes del espacio visual se verán igual que en las notas que ha citado, por lo que en este punto no estoy seguro de qué podría estar pasando. –

Respuesta

4

Tome un vistazo a la documentación de glTexGen (en su caso, que desea utilizar GL_EYE_LINEAR junto con un conjunto adecuado de coeficientes como se describe a continuación) y glEnable (GL_TEXTURE_GEN_*). Cuando habilita la función texgen para componentes de coordenadas de textura particulares (S, T, R y/o Q), los valores que especifica para esos componentes (a través de glTexCoord) se ignoran y las coordenadas de textura se generan según el modo glTexGen especificado.

Al calcular las coordenadas de la textura a través de GL_EYE_LINEAR, las coordenadas de los vértices primero se transforman en espacio visual por la matriz actual GL_MODELVIEW. Una vez en el espacio visual, para cada componente habilitado (S, T, R, Q), las coordenadas del vértice se transforman por el inverso de la matriz GL_MODELVIEW como se definió en el momento de la llamada al glTexGen, y el producto escalar entre las coordenadas resultantes y los coeficientes enviados a glTexGen se obtienen luego. Para cada componente habilitado, los valores escalares resultantes se convierten en los componentes correspondientes (S, T, R y/o Q) de las coordenadas de la textura, que finalmente se transforman mediante la matriz GL_TEXTURE para producir las coordenadas finales de la textura.

Para cada componente de textura, los coeficientes (a, b, c, d) enviados a glTexGen definen un plano ax + by + cz + d = 0. Asumiendo (a, b, c) es un vector de unidad de longitud , el resultado de la operación del producto escalar descrito anteriormente representa la distancia entre este plano y el vértice que se está procesando. Si GL_EYE_LINEAR está habilitado para los cuatro componentes de textura y las ecuaciones de plano para S, T, R y Q se definen respectivamente como (1.0, 0.0, 0.0, 0.0), (0.0, 1.0, 0.0, 0.0), (0.0, 0.0, 1.0, 0.0) y (0.0, 0.0, 0.0, 1.0), las coordenadas de textura producidas para cada componente de textura son exactamente las mismas que las coordenadas originales del vértice del espacio del objeto.Por lo tanto, la matriz GL_TEXTURE debe contener todas las operaciones que necesita para transformar estas coordenadas del espacio objeto al espacio de textura: modelado, visualización y proyección transforma convertir de objeto en coordenadas normalizadas de dispositivo, además de escala y El sesgo se transforma para convertir de las coordenadas de dispositivo normalizadas al espacio de textura.

+0

Muchas gracias por todo esto, ahora estoy tratando de implementarlo. – CakeMaster

+0

No estoy teniendo mucha suerte. Mi quad está texturizado con un solo color, parece que podría estar muy cercado, así que solo estamos viendo un píxel. Expandiré la pregunta – CakeMaster

+1

Noté en su código que no ha especificado los coeficientes (a través de glTexGen) para ninguno de los componentes de coordenadas de la textura. También noto que no has configurado la matriz GL_TEXTURE. Debe establecer los coeficientes de glTexGen a algo como (1.0, 0.0, 0.0, 0.0) para S, (0.0, 1.0, 0.0, 0.0) para T, etc. Esto proyectará las coordenadas de su espacio de ojo directamente en el espacio de objetos, y usted puede luego, aplique su vista y la proyección se transformará en la matriz GL_TEXTURE para transformarse del espacio de objetos en espacio de textura. –