Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





El peor shader del mundo

Iniciado por marcode, 28 de Agosto de 2006, 08:00:20 PM

« anterior - próximo »

marcode

Hace ya tiempo que toqué un poco los shaders pero sigo sin controlarlos casi nada, me preparé un pequeño modulo para leerlos, cargarlos, activarlos, etc. en lenguaje GLSL. Me funcionarón bien en las pruebas que hice, aunque no note ningún incremento de velocidad, más bien todo lo contrario, se supone que al hacer las operaciones y comprobaciones mínimas debería ser más rápido, pero no le di excesiva importancia.

Ahora quería ver si los podría implementar en mí terreno, por el rollo de la niebla y el efecto de luz en el horizonte. De momento probe a cargar un shader simple para ver si funcionaba para verlo solo con color.

Para mi sorpresa todo se vuelve 50 VECES MAS LENTO (medido) y tiene un pequeño defecto con el color, aparecen unas franjas más oscuras en el terreno que se hacen más gruesas al alejar la cámara.

¿que hago?, ¿mejor me dedico a la cría de gusanos de seda?

Este es el vertex shader:


void main(void)
{
   // normal MVP transform
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

   // Copy the primary color
   gl_FrontColor = gl_Color;
}


Imagino que tendré que desactivar algo que uso para la funcionalidad fija, pero yo pensaba que simplemente se ignoraría todo. A ver si alguien con experiencia sabe porqué puede ocurrir esto.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zupervaca

Creo que tu problema puede ser por la tarjeta grafica, yo tengo una nividia6800 y renderizando solo con shaders se gana velocidad, no obstante yo no uso glslang y si asm, no se si se notara ya que las veces que he tocado glslang no me funcionaba en ati y nvidia al mismo tiempo, asi que lo descarte como sistema de shaders definitivo.

La forma en que mas se gana velocidad en asm es haciendolo tu todo a pelo, es decir, tu clase de matriz, etc. de esta manera evitas llamadas a dlls, luego le pasas la matriz de transformacion al shader, bueno... esto es solo un ejemplo, no es que sea gran cosa, pero es el camino a seguir para sacar fps a tu juego.

marcode

No creo que sea por la tarjeta (ATI 9500) porque todos los ejemplos y demos me salen bien, y ya te digo que en las primeras pruebas que hice todo funcionaba correctamente aunque con un ligero descenso de velocidad, este problemon me ha surgido al intentar usarlo en la aplicación de terrenos.

Yo creo que debe ser por algo que uso que no le hace gracia, ¿realmente es suficiente con activar el shader para sustituir la funcionalidad fija?, no me lo explico.

Editado:

Insisto que no es un problema de perder unos frames, es que se me queda casi bloqueado, algo absurdo.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zupervaca

Citar¿realmente es suficiente con activar el shader para sustituir la funcionalidad fija?, no me lo explico
Entiendo lo que quieres decir, con indicar el shader ya se elimina todo el sistema de estados o sistema de render tradicional (exceptuando blend, zbuffer, zdepth y algun otro que ahora mismo no recuerdo).

Lo unico que se me ocurre es que tenga coordenadas de textura y no se las estes pasando o algo asi, es decir te falte esto: "gl_TexCoord[0] = gl_MultiTexCoord0;"

El codigo seria el siguiente:

void main(void)
{
   // normal MVP transform
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

   // Indicar coordenadas de textura
   gl_TexCoord[0] = gl_MultiTexCoord0;

   // Copy the primary color
   gl_FrontColor = gl_Color;
}

Es solo agregar la linea que te dije donde mas te guste, aunque como te he dicho con glslang voy a ciegas ya que me dio problemas con ati vs nvidia :cry:

Editado:
Voy a explicar el motivo ya que parece que doy palos de ciego :lol:
El motivo de por que puede ir lento y poniendo las coordenadas de textura vaya bien o por lo menos mejore en velocidad es que si le pasas una textura y se pone a renderizarla sin indicar las coordenadas de textura, estas, pueden tener valores absurdos, con lo que puede llegar a pensar que la textura es abismal o que es infintamente pequeña con lo que esta repitiendo la textura en 0.0f a 0.0f y se vuelva loco o algo asi. (Ahora creo que soy yo el que no se explica bien :D)

marcode

Pues tampoco es por las texturas porque al dibujar las tenía desactivadas. El caso es que he probado el shader con textura (como el que has puesto) y sucede exactamente lo mismo, sale, pero a 1 fps.

Pero estoy de acuerdo contigo en que hay algo que le está volviendo loco.

Ya contaré si lo descubro, mientras cualquier sugerencia es bienvenida.

-----------------------------------------------------------------

Editado:
He tenido suerte y lo he arreglado rápido, tanto que me da tiempo a editar este mensaje, al final era lo menos esperado, por culpa de esto.

glEnable(GL_FOG);  :shock:

...me lo expliquen
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

BeRSeRKeR

Cita de: "marcode"
Editado:
He tenido suerte y lo he arreglado rápido, tanto que me da tiempo a editar este mensaje, al final era lo menos esperado, por culpa de esto.

glEnable(GL_FOG);  :shock:

...me lo expliquen
No sé en OpenGL pero en Direct3D, si se utilizan shaders, la niebla hay que hacerla a través de los shaders. No es posible llevarla a cabo en la fixed pipeline.

Lo que no sé es por qué hace que vaya tan lento. Tal vez pase a emular los shaders por software, en cuyo caso es normal que vaya tan lento. :lol:

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

zupervaca

Bueno! que increible, pues digo lo mismo que Ber, la verdad es que yo nunca he activado el flag del fog usando shaders, pero esta bien saberlo, a mas de uno le ahorraras un susto.

PD: Me imagino que sera un bug de opengl, por favor no me ataqueis todos a la vez :P
PD2: Estaria bien que dejaras un ejecutable para que alguien con nvidia lo probara y ver si es un fallo de ati, ya que como te dije a mi me funcionaban bien el glslang en tarjetas nvidia, pero en ati no llegue a hacerlo funcionar correctamente. (Yo lo probaria, pero mi portatil no tiene los drivers de opengl metidos)

marcode

Ahora al cargar un fragment shader junto con el vertex funciona bien y rápido, aunque esté activa la niebla.

Supongo que le volvía loco algún parámetro obtenido del canal de vértices, se me ocurre una división por 0 o tal vez en una operación como clamp o exp (usados en la niebla), un estudio detallado de la funcionalidad fija daría con el problema exacto, pero con saber esto yo creo que es suficiente.

Si no llega a ser un fallo tan exagerado ni me doy cuenta, ojo con usar solo vertex shader con los estados de render activados.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Pablo Zurita

Yo personalmente uso glSlang porque tiene varios beneficios sobre ASM. Primero que nada, al ser un lenguaje de alto nivel es mas fácil de programar si estas acostumbrado a usar lenguajes de alto nivel (en mi caso C++). Segundo, como el nivel de abstracción con respecto al hardware es igual que con respecto a ARBfp y glSlang no compila a ARBfp en general varias funciones están muy optimizadas por los drivers. El microcódigo que pueden generar desde glSlang es muy bueno e incluso mejor que en ARBfb en varias situaciones. Y tercero hay muchas herramientas que soportan glSlang y no soportan ARBfb como por ejemplo el RenderMonkey de ATI.

Cita de: "zupervaca"PD: Me imagino que sera un bug de opengl, por favor no me ataqueis todos a la vez :P
No es un bug en la especificación de OpenGL, es un bug en la implementación de la especificación por parte de ATI.

zupervaca

CitarNo es un bug en la especificación de OpenGL, es un bug en la implementación de la especificación por parte de ATI
Por eso digo que lo mejor es poner un exe y probarlo en tarjetas nvidia :wink:






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.