Cálculo por vértice en teselación OpenGL

9

Intento implementar una simulación de tela basada en la posición usando tesselation de hardware. Esto significa que solo quiero cargar un quad de control en la tarjeta gráfica y luego usar el teselado y el sombreado de geometría para crear los nodos en la tela.

Esta idea sigue el papel:

Huynh, David, "Simulación de tela utilizando teselación de hardware" (2011). Tesis. Instituto de Tecnología de Rochester http://scholarworks.rit.edu/theses/265/

Sé cómo usar la teselación para crear los puntos simulados. Lo que no sé es cómo almacenar la información calculada en un framebuffer.

La geometría y también los sombreadores de evaluación de teselación tienen información necesaria para los cálculos por vértice. Pero, ¿pueden escribir directamente en el framebuffer?

El fragment-shader que conozco puede escribir en el framebuffer, pero mi información se interpolaría y ya no sabría qué escribir en qué posición.

Dragonseel
fuente
transformar los buffers de retroalimentación
monstruo de trinquete
Suena muy bien. Las limitaciones de la simulación de tela hacen que sea necesario que pueda acceder a todos los vecinos de una partícula (para calcular las fuerzas de resorte). ¿Se puede hacer esto con tales amortiguadores? ¿En un sombreador de geometría quizás? para evitar el búfer de comentarios para imprimir cada vértice varias veces, me gustaría usar GL_POINTS. Después de un primer vistazo, parece que esto hace que sea más difícil calcular los resortes.
Dragonseel

Respuestas:

3

Basándome en el comentario de "ratchet freak", investigué Transform Feedback Buffers y resolví mi problema de esa manera.

Ahora genero los puntos simulados en la CPU y los pongo en un objeto VertexBufferObject. Genero un segundo VBO para los puntos (junto con algunos otros para la velocidad). La conectividad de la tela se da como un atributo de vértice en ivec4.

Usando los buffers de feedback de transformación y un truco de doble buffer usando los dos VBOs, siempre puedo leer desde el último paso (usando la información de conectividad) y escribir en otro buffer. Esto es para resolver problemas con la concurrencia.

Los cálculos se realizan en el sombreador de vértices como GL_POINTS. Vinculando la salida del primer sombreador a otro sombreador regular usando un buffer de índice adicional para generar triángulos, puedo sin problemas renderizar la tela de la forma que quiera.

Esta idea sigue el ejemplo del búfer de feedback de transformación realizado en el libro "OpenGL Superbible" http://www.openglsuperbible.com/

Dragonseel
fuente