Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con GLSL ES

Iniciado por zunou, 23 de Julio de 2012, 02:21:10 PM

« anterior - próximo »

zunou

Hola, hace poco empecé a ponerme en serio con esto de GLSL en iOS  :D y aún no lo domino muy bien, la cuestión es que  decidi crearme un unico shader para todo en lugar de usar varios y así mediante condiciones, determinar que efecto añadir a cada modelo ( si tiene textura o no, si usa bump mapping, si se ilumina, etc...) durante el renderizado,
pero iluso de mí descubrí que la gpu procesa tanto la condición que se cumple como la que no, aunque solo muestre la correcta, y esto claro está supone que los fps decaigan, por ejemplo si un modelo no una bump mapping lo va a dibujar sin bump mapping, pero va a cunsumir lo mismo que si lo tuviera porque el programa tambien procesa la otra opcion, no se si me explico. ^_^

Se me ocurrió usar el preprocesador y poner condiciones del tipo #if BUMP == 1 .... pero no se como pasar las definiciones por cada modelo sin tener que compilar de nuevo el shader (si es que eso se puede hacer)

En fin no tengo ni idea ¿hay alguna forma eficiente de hacer esto, o no queda otra que usar varios shaders?

Gracias y un saludo :)


zunou

Gracias :) pero no me queda muy claro como hacer lo que dice, le daré un repaso XD

KneDa

Fallo mío, igual la presentación se queda algo escueta. Prueba googleando ubershader :D

zunou

No he encontrado demasiada info, pero creo que ya lo voy pillando :D a ver si consigo implementarlo en mi motor.
Gracias por la ayuda :)

KneDa

El caso es que con ubershaders la explosión combinatorio puede llegar a ser grande dependiendo de la forma en la que organizes las directivas condicionales de tu shader.

Supongo que una posible approach es, dependiendo del tipo de propiedades del material,  sería que en tiempo de ejecución crees el material recompilando el ubershader con los correspondientes flags y se haga cache. Por otra parte, si el ubershader no es muy complejo se podría pregenerar en tiempo de carga todas las posibles combinaciones (entendiendo en este contexto una combinación como un shader que produzca resultados válidos).

De todas formas, es pura especulación ya que nunca lo he intentado e igual hay otras formas de abordar el problema.

Suerte \o

TrOnTxU

En un "postmortem" que hay por ahi de un final fantasy usaban combinaciones de shaders.

La definición de los shaders en vez de con condicionales lo hacian con custom nodes del Hypershade de Maya. Cada nodo corresponde a un "chunck" de código del shader. Esto es parecido a hacerte un "preprocesador" para los shaders.

El rollo, es que dependiendo de las combinaciones de nodos que habian creado para los materiales se creaban solo los "shaders combinados" necesarios. Además tenian una "cache" con los shaders para reutilizar las combinaciones creadas. Pero al final ponia, que como siempre, mantener la complejidad de la "explosion combinatoria" es la muerte.


La aproximacion en mi SDK tambien es parecida al tema del uber shader. Yo utilizo preprocesado tambien, que ademas permite "compatibilizar" el codigo del shader entre OGL y OGL-ES, por ejemplo.

Yo creo que uno de los dilemas es cuando hacer el preprocesado del codigo del shader:

- Hacerlo durante la carga puede ser bueno o malo. Evita que tengas que tener todo el "texto" creado para los shaders (en OGL-ES hay que tener el codigo del shader en "source", no se puede precompilar nada). Pero hay que hacerlo en C++ porque estas en el engine, y además si tienes el tema de usar STL (std::string por ejemplo) y las reservas dinamicas de memoria, un poco restringido, es un peñazo.

- Si lo haces como un paso de "pregeneracion" de los recursos, lo puede hacer en cualquier lenguaje, como Python, Perl, Lua, etc. que son bastante buenos en esto de preprocesar texto (y lo haces en un pis-pas).

- Si usas un leguaje de script para generar el codigo de los shaders en "pregeneracion de recursos", tambien se puede generar código c++ por ejemplo (para linkar parametros o lo que sea), a partir de las definiciones de los shaders (este tipo de codigo se suele meter en headers). Luego recompilas el "motor" con los nuevos headers, y listo.


No sé, son algunas ideas, el tema este es demasiado amplio.

Un saludo
Vicent: Linked-In  ***  ¡¡Ya tengo blog!!

zunou

Creo que finalmente el ubershader es la mejor opción para lo que necesito ahora mismo, si que es verdad que puede llegar a ser un poco engorroso manejarlo según va creciendo en complejidad, pero de momento me sirve :)

Gracias!  ;)






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.