¿Cómo puedo usar la canalización de gráficos para representar datos volumétricos basados ​​en una función de densidad?

12

Ambas API de gráficos (OpenGL y DirectX) diseñan una canalización bien definida en la que varias etapas son programables. Estas etapas programables requieren tomar una cantidad mínima fija de datos y se supone que deben realizar un rango bien definido de operaciones en ella, y generar una salida mínima definida, para que los datos puedan pasar a la siguiente etapa correctamente. Parece que estas tuberías están diseñadas para funcionar solo con una cantidad limitada de tipos de datos geométricos, que en el caso de D3D y OGL son datos de vértices y coordenadas de textura.

Pero, si se da un caso cuando la aplicación que planeo hacer no usa vértices (o incluso vóxeles) para representar sus datos geométricos y no hace exactamente transformaciones o proyecciones o rasterización o interpolación o algo así, tales limitaciones de las API o la tubería hace las cosas difíciles.

Entonces, ¿hay alguna forma en que podamos cambiar la tubería de gráficos de manera que la funcionalidad de lo que cada etapa hace a los datos y el tipo de datos que se generan en cada etapa se modifique para mi ventaja? Si no es así, ¿hay alguna manera de utilizar las funciones API 'en bruto' para construir mi propia tubería? Si no, entonces mencione por qué no es posible.

EDITAR : Mi aplicación usa funciones de densidad para representar geometría. La función tiene un valor en cada punto del espacio. Divido el tronco de la cámara en una cuadrícula 3D, cada bloque se puede proyectar como un píxel. En cada bloque, integro la función de densidad y verifico si su valor es más que un valor requerido. En caso afirmativo, se supone que algo existe en ese bloque y se representa ese píxel correspondiente a ese bloque. Entonces, ahora en mi renderizador, quiero pasar la función (que represento con una cadena) al hardware de gráficos en lugar de los datos de vértice en los búferes de vértices. esto también implica que el sombreador de vértices no tendrá vértices para transformarse en espacio de clip homogéneo y el sombreador de fragmentos no obtiene información de píxeles. en cambio, ahora la mayor parte de la búsqueda y evaluación ocurre por píxel.

The Light Spark
fuente
¿Es 'función de densidad de función' una tautología?
Pharap
@Pharap, eso fue un error tipográfico. es simplemente "desity functon" que representa la presencia de "materia" en el espacio.
The Light Spark
2
Parece que solo quieres construir una isosuperficie, que es un problema bien estudiado. ¿Has visto http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html o has buscado Metaballs, visualización de nubes de puntos, extracción de isosuperficie o renderizado de volumen? Además, qué tipo de rendimiento necesita, eso hará una gran diferencia en la elección de la técnica que busca cuando se combina con la complejidad de sus cálculos. Creo que también encontrará que por píxel causará brillo cuando la cámara se mueva, y se requerirán subpíxeles.
Patrick Hughes

Respuestas:

18

Puede usar absolutamente la GPU para representar datos volumétricos.

Dado que desea evaluar un conjunto de funciones por píxel en la pantalla, un enfoque simple es representar un triángulo de pantalla completa. Este es solo un triángulo único que cubre toda la pantalla (en realidad, cubre más que la pantalla, ya que la pantalla no es triangular, pero la GPU descarta las partes fuera de la pantalla). Luego puede usar el sombreador de píxeles (que recibe las coordenadas de la pantalla del píxel que está sombreando) para construir un rayo a través de su volumen, evaluar funciones, lo que sea que necesite hacer.

(En contraste con las otras respuestas, no recomiendo un sombreador de cómputo porque parece que desea realizar operaciones por píxel, y un triángulo de pantalla completa + sombreador de píxeles generalmente es más eficiente para eso que un sombreador de cómputo, aunque los sombreadores de cálculo ciertamente también funcionarán).

El método de triángulo de pantalla completa es muy común en los gráficos en tiempo real para las operaciones de posprocesamiento, por lo que probablemente pueda encontrar toda la información que necesita con un poco de búsqueda en Google.

Por cierto, puede interesarle leer Rendering Worlds with Two Triangles de Iñigo Quílez, una charla que describe cómo renderizar escenas 3D compuestas usando funciones matemáticas (específicamente, campos de distancia) usando la técnica de sombreado de píxeles de pantalla completa.

Nathan Reed
fuente
Entonces, ¿el sombreador de píxeles toma entradas arbitrarias (como cadenas u otros tipos de objetos definidos por el usuario) para que pueda pasar mis funciones?
The Light Spark
Dudo que desee intentar ejecutar un analizador y / o lenguaje en cadenas de funciones arbitrarias en GPU, eso sería incómodo ya que las GPU no son realmente de propósito general. Lo más probable es que desee crear el sombreador dinámicamente en su código principal, luego deje que el sistema gráfico compile y ejecute el sombreador resultante.
Patrick Hughes
@TheLightSpark Correcto, no pasarías cadenas al sombreador (los lenguajes de sombreado ni siquiera tienen un tipo de cadena), te gustaría generar y compilar el código del sombreador para tus funciones deseadas. Eso se puede hacer en tiempo de ejecución si es necesario.
Nathan Reed
Comencé a leer su respuesta, imaginé un monitor en forma de triángulo;) ¿Tiene la ventaja de usar solo un triángulo en lugar de dos que cubran la pantalla sin descartar píxeles?
danijar
@danijar Sí, tiene una ligera ventaja sobre el uso de un quad porque algunos píxeles a lo largo de la diagonal se sombrearán dos veces si usa un quad de pantalla completa. Por otro lado, descartar píxeles fuera de la pantalla es gratuito ya que el rasterizador no generará esos píxeles para empezar.
Nathan Reed
6

El trazado de rayos y otras técnicas se realizan comúnmente con Compute Shaders, que Direct3D ha admitido desde el lanzamiento de D3D11 y OpenGL desde 4.3 (y más tiempo mediante el uso de OpenCL y algunas contorsiones).

Sean Middleditch
fuente
5

Suena como si quisiera usar un sombreador de cómputo GPU, o utilizar un objeto "Shader Storage Buffer" para ayudar a aumentar la tubería para satisfacer sus necesidades. Los matemáticos, científicos y otras personas que buscan en la GPU el cálculo de cosas que no se traducen exactamente en gráficos estándar utilizan este tipo de cosas.

Aunque la línea gráfica contemporánea es muy flexible, los desarrolladores aún tienden a tropezar con algunas restricciones. Sin embargo, la función de cálculo de sombreadores nos facilita la vida al no pensar en las etapas de la tubería, ya que estamos acostumbrados a pensar en vértices y fragmentos. Ya no estamos restringidos por las entradas y salidas de ciertas etapas de la tubería. La función Shader Storage Buffer Object (SSBO), por ejemplo, se ha introducido junto con los sombreadores de cómputo y eso brinda posibilidades adicionales para intercambiar datos entre etapas de canalización, además de ser entradas y salidas flexibles para sombreadores de cómputo.

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

Si esto no te apunta en la dirección correcta, ¿te importaría expandir el concepto tuyo que no se ajusta al paradigma de vértices / fragmentos?

AAorris
fuente
Edité mi respuesta para incluir lo que estoy haciendo. El sombreador de cómputo parece ser la respuesta, pero solo dime si hay algo más que pueda hacer.
The Light Spark