Pregunta

¡Ahoy!

He estado buscando actualizar un código de prueba antiguo en un intento de repasar las nuevas funciones agregadas a GLKit. Hasta ahora me las arreglé para configurar un GLKViewController y comenzar a renderizar algunas formas básicas, pero me ha costado encontrar información decente sobre GLKBaseEffect.

La documentación de GLKBaseEffect dice:

En el momento de la inicialización, su aplicación primero crea un contexto OpenGL ES 2.0 y lo actualiza. Luego, asigna e inicializa un nuevo objeto de efecto, configura sus propiedades y llama a su método prepareToDraw. Vincular un efecto hace que un sombreador se compile y se vincule al contexto actual de OpenGL ES. El efecto base también requiere que la aplicación proporcione datos de vértice. Para proporcionar datos de vértice, cree uno o más objetos de matriz de vértice. Para cada atributo requerido por el sombreador, el objeto de matriz de vértices debe habilitar el atributo y apuntar a los datos almacenados en un objeto de búfer de vértice.

Lo que estoy luchando por discernir es;

¿Necesito un objeto GLKBaseEffect para cada "modelo" que estoy renderizando? ¿O uso un solo GLKBaseEffect para cada "escena" y simplemente cambio las propiedades sobre la marcha antes de llamar a prepareToDraw?

He visto algunos tutoriales para motores de juegos y renderizadores que simplemente usan un solo GLKBaseEffect para cada modelo, pero esto parece completamente ineficiente si se pudiera lograr lo mismo con una sola instancia.

Al leer la documentación, casi parece que este es el mejor enfoque, pero considerando que he visto a tanta gente usando múltiples instancias, estoy empezando a pensar que este no es el caso.

¿Alguien puede arrojar algo de luz sobre esto? GLKit todavía es bastante nuevo para iOS (y para mí), por lo que cualquier información sería muy apreciada.

¿Fue útil?

Solución

No, no debe crear un GLKBaseEffect único para cada objeto.Por ejemplo, si está dibujando un laberinto, cada ladrillo en ese laberinto puede ser su propio objeto, pero todos pueden compartir el mismo GLKBaseEffect.Sin embargo, recuerde que GLKBaseEffect también almacena información en la ubicación, así como textura, iluminación, niebla, etc. Entonces, si desea dibujar los ladrillos en más de un lugar (lo que supongo que lo hace :-), modifica su matriz de transformación y luego llamala API 'prepareToDraw'.

Estoy de acuerdo en que necesitamos más tutoriales escritos por personas que han utilizado GLKBaseEffect ampliamente para obtener más información sobre las mejores prácticas para este nuevo marco.

Feliz navegación ..

Otros consejos

Cada cambio de las propiedades "fundamentales" (lightingType, lightModelTwoSided, colorMaterialEnabled, ...) hará que se cargue un nuevo programa de sombreado con la siguiente llamada "prepareToDraw".

Entonces, si no usa un orden de renderizado, prácticamente no importa si usa un efecto para cada objeto renderizado o un solo efecto de cambio para todos los objetos.En ambos casos, terminará con una llamada glUseProgram innecesaria y muchos cambios de estado OpenGL innecesarios para cada objeto dibujado.(utilice la plantilla de instrumentos "OpenGL ES Analysis" para investigar las llamadas OpenGL generadas)

Dicho esto, su interés principal debería ser ordenar sus objetos para renderizar.Al menos agrupe todos los objetos que utilicen el mismo programa de sombreado.Luego cree y use un objeto GLKBaseEffect para cada uno de esos grupos. Si no está seguro de si un cambio en la propiedad GLKBaseEffect hará que se cargue un nuevo programa de sombreado, le recomiendo usar Instrumentos para investigar las llamadas de OpenGL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top