2010-09-25 18 views
13

Me gustaría dibujar vóxeles usando opengl pero no parece que sea compatible. Hice una función de dibujo en cubo que tenía 24 vértices (4 vértices por cara) pero baja la velocidad de cuadros cuando dibujas 2500 cubos. Esperaba que hubiera una mejor manera. Idealmente, me gustaría enviar una posición, tamaño de borde y color a la tarjeta gráfica. No estoy seguro si puedo hacer esto usando GLSL para compilar instrucciones como parte del sombreador de fragmentos o el sombreador de vértices.¿Cuál es la forma más eficiente de dibujar voxels (cubos) en OpenGL?

Busqué en Google y descubrí sprites de puntos y sprites de carteles (¿lo mismo?). ¿Podrían ser utilizados como una alternativa para dibujar un cubo más rápido? Si uso 6, uno para cada cara, parece que estaría enviando mucha menos información a la tarjeta gráfica y con suerte obtendré una mejor velocidad de cuadros.

Otra idea es tal vez puedo dibujar múltiples cubos usando una sola llamada Drawelements?

Tal vez haya un método mejor que yo no conozca. Cualquier ayuda es apreciada.

Respuesta

12

Dibujar voxels con cubos es casi siempre el camino equivocado (el caso excepcional es el ray-tracing). Lo que generalmente desea hacer es poner los datos en una textura 3D y renderizar rebanadas dependiendo de la posición de la cámara. Consulte esta página: https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.html y puede encontrar otras técnicas buscando "volume rendering gpu".

+0

Sí, renderice hacia adelante a lo largo del eje que esté más alineado con la dirección de la vista. Comience por representar quads con transparencia. Una vez que eso funcione, puedes intentar insertar los "lados" entre cada capa también. – phkahler

+0

Tu enlace está roto ahora. – Ruslan

+0

@Ruslan actualizado – ybungalobill

5

Lo que estás buscando se llama instancing. Puede echar un vistazo a glDrawElementsInstanced y glDrawArraysInstanced para un par de posibilidades. Tenga en cuenta que estos solo se agregaron como operaciones centrales hace relativamente poco tiempo (OGL 3.1), pero han estado disponibles como extensiones bastante más tiempo.

nVidia's OpenGL SDK tiene un ejemplo de dibujo instanciado en OpenGL.

0

En primer lugar, realmente debería mirar OpenGL 3+ usando GLSL. Este ha sido el estándar por bastante tiempo. En segundo lugar, la mayoría de las implementaciones Minecraft-esque utilizan creación de malla en el lado de la CPU. Esta técnica implica mirar todas las posiciones de bloque y crear un objeto de búfer de vértice que represente los triángulos de todas las caras expuestas. El VBO solo se genera cuando los vóxeles cambian y persisten entre fotogramas. Una implementación ideal combinaría caras coplanares de la misma textura en caras más grandes.

Cuestiones relacionadas