2010-09-26 19 views
8

Estoy aprendiendo a usar mapas normales (por iluminación de píxeles?) En gráficos 2D con OpenGL.¿Cómo aplicar un mapa normal en OpenGL?

Nuevo en el mapeo normal, logré abarcar al operador de Sobel y la generación de mapas normales (principalmente gracias a this), que está creando una matriz (2D) de normales a partir de una matriz de píxeles (2D) datos.

(La mayoría de los tutoriales y los hilos del foro que he encontrado eran específicos para 3D utiliza y software de modelado. Me propongo implementar esta funcionalidad a mí mismo, en C++.)

  • ¿Qué hago una vez que' ¿Tienes el mapa normal de ?
  • ¿Debo registrarlo con OpenGL?
  • ¿Tiene que asociarse con la textura, si es así, cómo se hace ?
  • ¿Cómo se asigna a un 2D quad texturizado?
  • (¿Es esto algo que puedo hacer sin shaders/GLSL?)

Respuesta

6

le recomiendo que busque en:

This nvidia presentation on bumb mapping

no he mirado esto durante un tiempo, pero recuerdo que va sobre la mayor parte de los detalles en la implementación de un shader mapa de relieve, debe obtener una pocas ideas funcionando.

This other nvidia tutorial for implementing bump mapping in the cg shader langauge

This bump mapping tutorial might also be helpful.

Sé que todos estos no son para el mapeo normal pero son un buen comienzo.

Además, si bien existen diferencias en los lenguajes de sombreado, no debería ser difícil convertir formulistas entre ellos si desea usar GLSL.

Como ybungalobill Dicho esto, puede hacerlo sin shaders pero a menos que usted está trabajando en un proyecto educativo (por su educación) o un dispositivo integrado en particular, no tengo idea de por qué demonios querría - pero si necesita this es donde desea buscar, fue escrito antes de los sombreadores y se actualizó para referenciarlos más tarde.

+0

Gracias, la presentación nVidia y los 3DKingdoms son geniales. He visto paulsprojects uno, pero estaba perdido cuando comenzó en los mapas de cubo. – zyndor

5
  • ¿Qué hago una vez que tengo el mapa normal?
  • ¿Debo registrarlo con OpenGL?

Sí, necesita cargarlo como una textura.

  • ¿Tiene que estar asociado con la textura, en caso afirmativo, ¿cómo se hace?

Si quiere decir asociados con la textura del color, entonces no. Necesita crear una textura que contenga el mapa normal para usarlo más tarde con OpenGl.

  • ¿Cómo es mapeada a un quad textura 2D?

Su mapa normal es simplemente otra textura, que ates y mapa como cualquier otra textura.

El mapa normal almacena las normales en las coordenadas del espacio tangente, por lo que para calcular la iluminación por píxel es necesario conocer la posición relativa de la fuente de luz en el sistema de coordenadas del espacio tangente. Esto se hace estableciendo parámetros adicionales por vértice (normal, tangente, binormal), calculando la posición de la fuente de luz en las coordenadas del espacio tangente e interpolando esta posición a lo largo de los triángulos. En el sombreador de fragmentos busca la normal en el mapa normal y realiza el cálculo de iluminación deseado en función de los parámetros interpolados.

  • (¿Es esto algo que puedo hacer sin shaders/GLSL?)

Sí, puede utilizar algunas extensiones de legado para programar las funciones de combinación entorno multi-textura. Nunca lo hice yo mismo, pero se ve como el infierno.

+0

great, multitexturing es lo que tenía en mente (y sí, voy a ir con shaders =)). ¡Gracias! – zyndor

1

el tema es bastante antiguo, pero voy a responder por cualquier principiante que podría buscar cualquier ayuda aquí:

1) & 2)

su mapa normal es como una textura difusa normal, se Necesito cargarlo desde el disco, crear tu texture2D como lo harías con la textura difusa, y bloquearlo con las otras texturas para enviarlo a los shaders. Para resumir, los mapas normales, los mapas de altura, etc. no son diferentes cuando se trata con el lado de la CPU ... siempre los está cargando, creando la textura y bloqueándolos.

3)

mapas normales son simplemente una manera de almacenar las normales de cada fragmento en una textura. Es mejor usarlos con la textura difusa correspondiente, porque esa es la manera de fingir los pequeños detalles. Sin embargo, no siempre es necesario en algunos casos ... por ejemplo, la última vez que trabajé en una forma de obtener agua ... utilicé un mapa de dudv y un mapa normal, pero no el mapa difuso correspondiente, como usado para renderizar en texturas para lograr la reflexión.

4)

mapas normales se hacen corresponder con el mismo coordenadas de textura como la textura difusa ... que significa que si usted tiene un quad coordenadas wich son 0; 0, 0; 1, 1; 0, 1; 1 estas son las coordenadas que utiliza para asignar ambas texturas.

5)

que podría hacerlo sin shaders, supongo ... incluso se puede hacer sin OpenGL si quieres ... shaders están diseñados para este tipo de operaciones, y que va a ser más fácil haz eso con shaders.

Por lo tanto, los mapas normales son texturas que codifican vectores normales en colores ... un vector normal es un vector 3D y los colores son vectores 3D también. Cuando utiliza iluminación, generalmente envía sus normales desde el sombreador de vértices al sombreador de fragmentos ... el sombreador de fragmentos interpolará el valor del vértice normal para encontrar una aproximación del vector normal del píxel. esto se hace de manera predeterminada ...

Con los mapas normales, no se usa un vector normal de vértice, sino el vector normal codificado en la textura.

En primer lugar, deberá convertir el cálculo de iluminación del espacio mundial en espacio tangente. Esto se hace en el sombreado de vértices.

y luego, muestreará su mapa normal en el sombreador de fragmentos como una textura normal. Obtendrá un color RGB de su píxel. tendrá que convertir ese valor en un vector normal, es decir, multiplicarlo por 2 y restar 1, es decir, rgb * 2 - 1, luego usarlo como su vector normal en el cálculo de iluminación.

Cuestiones relacionadas