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.
Respuestas:
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.
fuente
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).
fuente
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.
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?
fuente