Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: fgutierrez en 04 de Octubre de 2007, 12:44:21 PM

Título: Shaders
Publicado por: fgutierrez en 04 de Octubre de 2007, 12:44:21 PM
Hola, buenos dias. Estoy un poco confundido con lo que leo sobre los shaders. Parece ser que es una forma de configurar el Pipeline de la tarjeta gráfica, pero no acabo de entender a que se refiere con esto. Entiendo, pero no estoy seguro de si esto es asi, que los shaders son funciones que tratan de aprovechar ciertas capacidades que poseen algunas tarjetas gráficas para realizar de forma más eficiente tareas comunes de OpenGL como texturización, dar color a ciertos polígonos, iluminación, etc... ¿Alguno puede darme algún ejemplo de como se puede utilizar esto?
Muchas gracias. Fernando.
Título: Shaders
Publicado por: Shaitan en 04 de Octubre de 2007, 03:33:36 PM
Creo que es más facil que te leas un tutorial que explicarlo aqui:

http://www.lighthouse3d.com/opengl/glsl/index.php?intro

Basicamente lo que se permite con el uso de shaders es reemplazar ciertas partes del pipeline de OGL (o DX) por programillas propios, pudiendo hacer efectos (como desplazar vertices - Vertex shaders, o cambiar colores - pixel shaders) que de otra forma OGL los haría siempre igual. Esto te da la capacidad de calcular estos parámetros a partir de otros datos que te sean de interés pasándole la mínima cantidad de información a la tarjeta (los vertices igual que siempre, más los shaders, más alguna que otra textura...)
Por supuesto, tiene la ventaja de que esto se realiza en hard.

No se si te habrá aclarado algo... Mejor leete bien el tutorial...

J.
Título: Shaders
Publicado por: tamat en 04 de Octubre de 2007, 04:13:04 PM
La mejor manera de entenderlo es no pensar en OpenGL como una manera de "pintar poligonos con una textura encima" sino en una manera de pintar, a secas.

Antiguamente tu lanzabas a la tarjeta una serie de triangulos con su color y texturas, y la tarjeta se encargaba de aplicar algoritmos muy basicos para iluminar, texturizar, etc.

Pero esa parte sigue siendo parte de la programación gráfica y por lo tanto debería estar en manos del programador alterarlas, así que ahora tambien esa parte la programamos nosotros, lo que nos permite pintar los poligonos de maneras mucho más rebuscadas, lo que produce efectos mucho más trabajados.

Claro que si lo que tu quieres es pintar triangulos con una textura pues no necesitas shaders.
Título: Shaders
Publicado por: Tei en 04 de Octubre de 2007, 04:32:28 PM
Cita de: "tamat"..debería estar en manos del programador alterarlas, así que ahora también esa parte la programamos nosotros, lo que nos permite pintar los polígonos de maneras mucho más rebuscadas, lo que produce efectos mucho más trabajados.

¿Eso significa que podríamos hacer un shader para manipular la posición de los vertex y crear una arquitectura deformada? (al estilo de Dungeon Keerper, por ejemplo)

(http://www-tech.mit.edu/V117/N53/dungeonkeeper.53.gif)

update: error de tipeo corregido: escribi poligonos, y quería decir vertex
Título: Shaders
Publicado por: Shaitan en 04 de Octubre de 2007, 04:55:07 PM
Eso precisamente se puede hacer con un vertex shader...

J.
Título: Shaders
Publicado por: Ruben en 04 de Octubre de 2007, 05:42:54 PM
Hi,
para eso no haria falta shaders, con usar las transformaciones de mundo, vista y perspectiva del api(dx u opengl) valdria.

Si quieres ver buenos ejemplos de un pipeline orientado a shaders mirate "Renderman", aunque no lo vayas a usar es muy didactico.

Un saludo,
Ruben
Título: Shaders
Publicado por: Shaitan en 05 de Octubre de 2007, 08:35:06 AM
Ya, y si ahora lo que quieres es para el mismo escenario hacer otra distorsión diferente? A volver a editar todo el escenario?. Vamos a ver, si lo que dices es que se puede hacer con primitivas a lo glRotate, lo llevas claro... Si los del dugeon keeper hicieran todos los escenarios programados con primitivas (a pelo, en ogl), me parece que habría uno o dos escenarios en todo el juego...

J.
Título: Shaders
Publicado por: t-spy en 05 de Octubre de 2007, 08:52:52 AM
Creo que no conoces mucho el Dungeon Keeper. Deberías saber que es un juego del 97 y que ni siquiera usaba aceleración por hardware, así que de shaders mejor ni hablamos.  :wink:
Título: Shaders
Publicado por: Tei en 05 de Octubre de 2007, 09:33:48 AM
a lo que me refiero es que tienes los vertices de los poligonos en linea:


*
|
*
|
*
|
*
|
*


Pero no quieres renderizar esto. Porque te saldrian columnas y muros rectos. Y quieres que se rendericen torcidos. Naturalmente lo podrias hacer al diseñar el mapa, pero es mucha informacion y mucho trabajo que se puede automatizar... y al automatizar queda homogeneo (quedara mejor).  Realmente tampoco lo quieres hacer en soft, porque tendrias que enviar poligonos uno a uno..  que es lento.

Entonces modificas ligeramente la posicion de los vertex, haciendo un pequeño desplazamiento basandote en el coseno(X) y el seno(Y) (usando senos y consenos, no por nada, sino porque estan acotados entre -1 y +1, para no obtener desplazamientos enormes, sino acotados)

Y entonces te sale un muro/columna deformados:


*
|
*
|
 *
|
*
|
*


Puse el ejemplo de los muros/columnas de dungeon keeper, porque ese motor de software dibuja muros deformados. Y siempre ma ha parecido una renderizacion muy chula. Y por eso preguntaba si es posible hacer esto concreto con shaders.
Título: Shaders
Publicado por: BeRSeRKeR en 05 de Octubre de 2007, 11:04:22 AM
Cita de: "Tei"Puse el ejemplo de los muros/columnas de dungeon keeper, porque ese motor de software dibuja muros deformados. Y siempre ma ha parecido una renderizacion muy chula. Y por eso preguntaba si es posible hacer esto concreto con shaders.
Sí, se puede hacer con un vertex shader.

Saludos.
Título: Shaders
Publicado por: Shaitan en 05 de Octubre de 2007, 11:42:06 AM
No es cuestión de conocer o no el dugeon keeper. Es cuestión de que el dugeon keeper crearían la geometría deformada, con algun programa de modelado. No creo que usasen transformaciones 'a pelo' en OGL o DX. Estamos hablando de crear una geometría genérica y poder deformarla sin modificar los ficheros 3ds o lo que sea a través de un programa --> para esto son los vertex shaders.
Y sigo estando seguro de que el dugeon keeper no hicieron la geometría 'proceduralmente'

CitarCreo que no conoces mucho el Dungeon Keeper. Deberías saber que es un juego del 97 y que ni siquiera usaba aceleración por hardware, así que de shaders mejor ni hablamos. Wink

En ningún momento he dicho que el dugeon keeper utilizase shaders, no pongas en mi boca palabras que no he dicho...

J.
Título: Shaders
Publicado por: Ruben en 05 de Octubre de 2007, 02:59:29 PM
Hi,
Citar¿Eso significa que podriamos hacer un shader para manipular la posicion de los poligonos y crear una arquitectura deformada? (al estilo de Dungeon Keerper, por ejemplo)  
Pense que con deformacion estabas refiriendote a la deformacion alargada de los objetos por la perspectiva. Mala interpretacion.  :roll:

Busca bump mapping, parallax mapping o displacement mapping.

Un saludo,
Ruben
Título: Shaders
Publicado por: Tei en 05 de Octubre de 2007, 03:10:35 PM
Evidentemente nos hemos despistado un poco. Olvidemos el DK, que solo lo saque a colación  porque no se me ocurrio un ejemplo mejor.

Mis disculpas a todos O:]
Título: Shaders
Publicado por: Shaitan en 05 de Octubre de 2007, 03:15:30 PM
Si, la verdad es que a veces leemos demasiado rápido los posts y acabamos interpretando mal algunas cosas. Bueno, por lo menos espero que quede claro 'el concepto'  :lol:

J.
Título: Shaders
Publicado por: tamat en 05 de Octubre de 2007, 03:27:27 PM
Lo de deformar geometría por shaders se usan principalmente para temas de animacion esqueletal. Tu subes una serie de matrices al shader y en cada vertice guardas informacion sobre qué matrices le afectan y cuanto.

Despues en el vertex shader solo tienes que deformar ese vertice acorde con  las matrices que le afectan.

El resultado es que en CPU tu solo subes unos datos estáticos (mesh y propiedades de cada vertice) y una serie de matrices, y te renderiza en pantalla el personaje modificado, liberando así a la CPU de muchisima carga.
Título: Shaders
Publicado por: JL10 en 18 de Octubre de 2007, 05:31:04 PM
Entonces, para un escenario complejo, se puede  activar/desactivar los shaders cuando se precise para que solo afecta a parte de los Objetos?, o tiene todo que pasar por shaders?

Gracias
Título: Shaders
Publicado por: Shaitan en 18 de Octubre de 2007, 06:22:38 PM
Si, se pueden activar/desactivar para cada objeto. Incluso se pueden utilizar solamente con partes de objetos, etc.También puedes utilizar un shader para hacer un postproceso de toda la pantalla (de la imagen resultado, por ejemplo para hacer un blur de toda la pantalla o un fade a un color...).

J.
Título: Shaders
Publicado por: JL10 en 19 de Octubre de 2007, 10:54:21 AM
Cita de: "Shaitan"...un shader para hacer un postproceso de toda la pantalla (de la imagen resultado, por ejemplo para hacer un blur de toda la pantalla o un fade a un color...).

Pero esto sería lo que se llama un pixel-shader o fragment-shader??
Título: Shaders
Publicado por: r2d2rigo en 19 de Octubre de 2007, 03:08:57 PM
Pixel shader. Renderizas la escena, haces una copia de lo que hay actualmente en pantalla con glCopyTexImage2D (o su equivalente en DX) y entonces tendras una textura "plana" con una copia de lo que habia en la pantalla. Le aplicas un pixel shader para, por ejemplo, realzar los verdes, o hacer una sobreexposicion multiplicando el color de cada pixel por si mismo, y la vuelves a dibujar en pantalla.
Título: Shaders
Publicado por: Prompt en 22 de Octubre de 2007, 10:12:27 AM
Me estoy liando hasta yo de leerlo :P

A ver si mi visión simple te ayuda.


Que es un "Program Object" o Shader?
Es un programa ( conjunto de código... variables, statements... ) que se ejecuta en la GPU y modifica el comportamiento establecido en el renderizado. Con el geometric shader no solo modificamos sino que también creamos allí geometría.

Veamoslo desde el punto de vista de la modificación, que es lo que comenta tamat:
1 - Arranca el Motor de juego y el motro grafico...
2 - Cargas un array de vertices e indices de un fichero, este es tu modelo 3D.
3 - Reservas un Vertex Buffer Object en memoria de la tarjeta y le pasas esos verticves e indices, por ejemplo. Con esto pasamos a la memoria de la tarjeta grafica lo que vamos a renderizar.
4 - Renderizamos.


Este es el comportamiento habitual, pero donde entran los llamados "Shaders" ( o programas de la GPU ? es más facilmente entendible quizás )

1 - Arranca el Motor de juego y el motro grafico...
2 - Cargas un array de vertices e indices de un fichero, este es tu modelo 3D.
3 - Reservas un Vertex Buffer Object en memoria de la tarjeta y le pasas esos verticves e indices, por ejemplo. Con esto pasamos a la memoria de la tarjeta grafica lo que vamos a renderizar.
4.1 - VERTEX_SHADER.begin(): aqui se ejecutará nuestro código, nuestro vertex shader por cada vertice de nuestro VBO. Si fuera un Fragment Shader pues, por cada "pixel" o fragmento.

4.2 - Renderizamos.
4.3 - VERTEX_SHADER.end()


La ejecución de los Shaders se ejecuta siempre, por cada vertice y por cada fragmento. Con lo cual si en nuestro vertex shader del muro ( del dungeon keeper que nos muestra tamat ) cogemos y aplicamos un valor aleatorio podemos ir moviendo la posición de cada vertice un poco arriba o un poco y hacer un efecto de distorsión facil. Evidentemente el efecto es poco costoso dependiendo del numero de vertices y el efecto es patatero. Podemos obtener mejor calidad con un Fragment Shader... pero eso es otra historia.

Espero haber sido de ayuda con esta breve explicación :)