Cómo hacer ray tracing en OpenGL moderno?


Así que estoy en un punto en el que debería comenzar a iluminar mis modelos de colores planos. La aplicación de prueba es un caso de prueba para la implementación de solo los últimos métodos, así que me di cuenta de que idealmente debería implementar el trazado de rayos (ya que teóricamente, podría ser ideal para gráficos en tiempo real en unos pocos años).

Pero ¿por dónde empiezo?

Supongamos que nunca he hecho iluminación en OpenGL antiguo, por lo que iría directamente a métodos no obsoletos.

La aplicación tiene actualmente configure correctamente los objetos vertex buffer, vertex, normal y color de entrada y dibuje y transforme correctamente los modelos en el espacio, en un color plano.

¿Hay una fuente de información que tome uno de los vértices planos de color a todo lo que se necesita para un resultado final adecuado a través de GLSL? Idealmente con cualquier otro método de iluminación adicional que pueda ser necesario para complementarlo.

2 answers

No recomendaría probar el trazado de rayos real en OpenGL porque necesita muchos hacks y trucos para eso y, si me pregunta, no tiene sentido hacer esto más. Si desea hacer trazado de rayos en GPU, debe ir con cualquier lenguaje GPGPU, como CUDA u OpenCL porque hace las cosas mucho más fáciles (pero aún así, lejos de ser trivial).

Para ilustrar el problema un poco más: Para el trazado de rayos, debe rastrear los rayos secundarios y probar la intersección con el geometría. Por lo tanto, necesita acceder a la geometría de alguna manera inteligente dentro de su sombreador, sin embargo, dentro de un sombreador de fragmentos, no puede acceder a la geometría, si no la almacena "codificada" en alguna textura. El sombreador de vértices tampoco le proporciona esta información de geometría de forma nativa, y los sombreadores de geometría solo conocen a los vecinos, por lo que aquí ya comienza el problema. A continuación, necesita estructuras de datos de aceleración para obtener velocidades de fotogramas razonables. Sin embargo, atravesar, por ejemplo, un árbol Kd dentro de un shader es bastante difícil y si mal no recuerdo, hay varios documentos únicamente sobre este problema. Si realmente quieres seguir esta ruta, sin embargo, hay muchos documentos sobre este tema, no debería ser demasiado difícil encontrarlos.

Un trazador de rayos requiere patrones de acceso y almacenamiento en caché extremadamente bien diseñados para alcanzar un buen rendimiento. Sin embargo, solo tiene poco control sobre estos dentro de GLSL y optimizar el rendimiento puede ser realmente difícil.

Otro punto a tener en cuenta es que, en al menos que yo sepa, el trazado de rayos en tiempo real en las GPU se limita principalmente a escenas estáticas porque, por ejemplo, los árboles kd solo funcionan (bien) para escenas estáticas. Si desea tener escenas dinámicas, necesita otras estructuras de datos (por ejemplo, BVHs, iirc?) pero usted necesita constantemente mantener ésos. Si no me he perdido nada, todavía hay una gran cantidad de investigación actualmente en curso solo sobre este tema.

 27
Author: zerm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-08 11:44:19

Usted puede estar confundiendo algunas cosas.

OpenGL es un rasterizador. Forzarlo a hacer raytracing es posible, pero difícil. Esta es la razón por la que raytracing no es "ideal para gráficos en tiempo real en unos pocos años". En pocos años, solo los sistemas híbridos serán viables.

Entonces, tienes tres posibilidades.

  • Trazado de rayos puro. Renderiza solo un quad de pantalla completa y, en el sombreador de fragmentos, lee la descripción de la escena empaquetada en un búfer (como una textura), recorre la jerarquía y calcula intersecciones de triángulos de rayos.
  • Raytracing híbrido. Rasterizar la escena de la manera normal, y utilizar raytracing en el sombreador en algunas partes de la escena que realmente lo requiere (refracción, ... pero puede ser simultáneo en la rasterización)
  • Rasterización pura. El sombreador de fragmentos hace su trabajo normal.

¿Qué quieres lograr exactamente ? Puedo mejorar la respuesta dependiendo de sus necesidades.

De todos modos, esta pregunta está altamente relacionada. Incluso si esto la implementación particular tiene un error, es definitivamente el camino a seguir. Otra posibilidad es openCL, pero el concepto es el mismo.

 20
Author: Calvin1602,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:33