Estoy planeando hacer instancias de geometría en OpenGL ES 2.0 Básicamente planeo renderizar la misma geometría (una silla) quizás 1000 veces en mi escena.
¿Cuál es la mejor manera de hacer esto en OpenGL ES 2.0?
Estoy considerando pasar la vista de modelo mat4 como un atributo. Como los atributos son por datos de vértice, necesito pasar este mismo tapete, tres veces por cada vértice del mismo triángulo (dado que la vista del modelo permanece constante en los vértices del triángulo).
Eso equivaldría a una gran cantidad de datos adicionales enviados a la GPU (2 vértices adicionales * 16 flotantes * (Cantidad de triángulos) cantidad de datos adicionales).
¿O debería enviar el mat4 solo una vez por triángulo? ¿Pero cómo es eso posible usando atributos ya que los atributos se definen como datos "por vértice"?
¿Cuál es la mejor y más eficiente forma de hacer instancias en OpenGL ES 2.0?
fuente
glVertexAttribDivisor
:(Respuestas:
ES2 no tiene glVertexAttribDivisor ni texturas de coma flotante, por lo que sus opciones son bastante limitadas.
Definitivamente ponga su modelo de silla en un VBO si aún no lo está haciendo. A partir de ahí, estará más o menos restringido a las llamadas de extracción individuales, una por silla, por lo que se trata de llevar la matriz de transformación de cada silla a la GPU de la manera más eficiente posible.
Puede hacer esto con llamadas regulares de glUniform, o puede abusar de algunas ranuras adicionales de vértice de la matriz y hacer algunas llamadas glVertexAttrib (nota: no glVertexAttribPointer) antes de dibujar cada silla, especificando la matriz usando 4 de esas ranuras, y estos valores se "pegarán" para cada vértice posterior en la silla. Esa puede ser una ruta lo suficientemente rápida en algunos hardware pero más lenta en otros, por lo que tendrá que experimentar.
Si sus sillas no giran, otra cosa que puede hacer es enviar la posición a su sombreador y construir una nueva matriz de transformación sobre la marcha allí. Eso suena horrible, pero en realidad es increíblemente rápido (solo está configurando 3 flotadores) y podría hacer el trabajo.
Sin embargo, en general, y suponiendo que estás apuntando a una plataforma móvil típica, estoy pensando que hagas lo que hagas, las llamadas de extracción te matarán.
fuente
Su mejor opción es utilizar un enfoque de instancias bastante similar a los modelos de piel. Cree un VBO que contenga muchas copias de su silla, todas idénticas. Ahora, cada vértice debe tener un atributo de byte que contendrá el índice de la matriz de transformación que se le aplicará. Envíe una matriz de matrices a su sombreador y úselas como la transformación mundial de cada una de sus sillas. De esta manera, puede dibujar en cada llamada tantas sillas como el tamaño máximo del parámetro de matriz, sin tener que reescribir ningún dato en el VBO.
fuente
Wolfire Games tiene una excelente publicación de blog sobre instancias rápidas de objetos . Lo que hacen es renderizar el modelo varias veces, pero enviar una matriz diferente para cada objeto a una ranura uniforme.
Esta es una manera bastante eficiente de instanciar un montón de objetos, porque solo tiene que enviar los datos una vez (el mayor cuello de botella cuando se procesa un lote de objetos siempre será el ancho de banda) y luego transformar el modelo en un sombreador.
fuente
http://www.youtube.com/watch?v=rfQ8rKGTVlg
Este es un Google Talk en WebGL, que es OpenGL ES para JavaScript, lo que significa que tampoco hay instancias de geometría. Puede darte una idea, aunque es difícil saberlo porque no sé si tu cuello de botella está en la GPU o la CPU.
Sin embargo, debe aprender sobre las variables uniformes, no hay absolutamente ninguna necesidad de enviar un mat4 en un atributo, todos los vértices de su silla se transformarán por la misma matriz, debe enviarlo solo una vez por modelo, no por triángulo. Las variables uniformes le permiten hacer eso, son un tipo especial de variables que puede establecer en el propio programa de sombreado.
fuente