sirve que primitivas para glutpostredisplay glpushmatrix glortho figuras ejemplo animacion opengl graphics 3d opengl-es-2.0

que - opengl pdf



¿Cuál es la mejor práctica para dibujar objetos por lotes con diferentes transformaciones? (2)

Aquí hay una idea alternativa:

Dé a cada vértice un ID de objeto que se pase a través de un atributo. Luego, en el sombreado de vértices, use este ID para hacer una búsqueda en una textura donde almacene sus matrices de transformación.

Estoy conceptualizando un buen enfoque para representar tantas piezas de geometría desunidas con una sola llamada de dibujo en OpenGL, y el muro al que me enfrento es la mejor manera de hacerlo cuando cada pieza tiene una traducción diferente y quizás una rotación, ya que no tiene el lujo de actualizar el modelo de vista uniforme entre los dibujados de un solo objeto. He leído algunas otras preguntas aquí y en otros lugares y parece que las indicaciones a las que apuntan las personas son bastante variadas. Sería bueno enumerar los métodos principales para hacer esto e intentar aislar lo que es más común o recomendado. Aquí están las ideas que he considerado:

[Editar: Se eliminó la mención de Instancia, ya que en realidad no se aplica aquí]

  1. Creando transformaciones matriciales en el shader. Aquí enviaría un vector de traducción o quizás un ángulo de rotación o cuaternión como parte de los atributos. La ventaja es que funcionaría multiplataforma incluido el móvil. Pero parece un poco inútil enviar exactamente los mismos datos de transformación para cada vértice en un objeto, como un atributo. Sin instancias, tendré que repetir estos vectores o escalares idénticos para un solo objeto muchas veces en un VBO como parte de la matriz de intercalación, ¿verdad? El otro inconveniente es que confío en el shader para hacer los cálculos; No sé si esto es sabio o no.

  2. Al igual que en 1), pero en lugar de confiar en el sombreador para hacer los cálculos de la matriz, hago esto en el lado del cliente, pero todavía envío la matriz de la vista del modelo final como un flujo de 16 flotadores en el VBO. Pero por lo que puedo decir, sin instanciar, tendría que repetir este flujo idéntico para cada vértice en el VBO, ¿verdad? Simplemente parece un desperdicio. La compensación con 2) anterior es que estoy enviando más datos en el VBO por vértice (16 flotantes en lugar de un vector de 3 flotadores para la traducción y tal vez un cuaternión de 4 flotadores), pero requiere que el sombreador haga menos trabajo.

  3. Omita todas las limitaciones anteriores y, en su lugar, haga concesiones con una llamada de sorteo separada para cada objeto. Esto es lo que normalmente se "enseña" en los libros que estoy leyendo, sin duda por razones de simplicidad.

¿Hay otros métodos comunes que estos?

Como pregunta académica, tengo curiosidad por si todo lo anterior es factible y "aceptable" o si uno de ellos es claramente un ganador sobre los demás. Si tuviera que utilizar exclusivamente el escritorio GL, ¿la creación de instancias es la principal forma de lograrlo?


Dos consideraciones:

En general, si tiene varios objetos, con cada objeto que utiliza transformaciones independientes, utiliza múltiples llamadas de sorteo. Para eso están ellos. La antigua presentación de "Batch Batch Batch" de NVIDIA citó entre 10,000 y 40,000 llamadas por trama (en D3D. Más en GL) para una GPU de 1 GHz. Hoy en día, estás viendo algo más que eso. Entonces, a menos que estés tratando con decenas de miles de objetos individuales, todos ellos diferentes (por lo que no hay instancias), es muy probable que estés bien.

Otra idea:

Elimine por completo los cálculos de la matriz de Modelview y solo pase los vértices después de la multiplicación. Esto permite una única llamada de sorteo para muchos objetos en diferentes orientaciones y traducciones. El costo solo viene en todos los cálculos de la CPU, pero supongo que si ese cuello de botella no es tan grande como el cuello de botella de múltiples llamadas de sorteo, valdría la pena.

(Tomado de here .)