Detalle de horizonte de agua de rejilla proyectado

13

Estoy tratando de implementar una escena oceánica con C ++ y DirectX11. Actualmente tengo una grilla proyectada, ondas de Gerstner y un sombreado básico. Mi problema es que cuando apunto mi cámara horizontalmente, para poder ver el horizonte del agua, en la distancia, la cuadrícula proyectada se vuelve insuficiente, incluso con números de vértices altos. Estas capturas de pantalla ilustran el problema:

superficie de agua sombreada

superficie de agua de estructura metálica

Sé que la causa del problema está en el concepto de la cuadrícula proyectada (la cuadrícula se detalla cerca de la cámara, más o menos lejos de ella), pero debe haber una mejor práctica para resolver esto.

¿Algunas ideas?

Gábor Szalóki
fuente

Respuestas:

7

Creo que una solución común es dividir la transformación de la cámara utilizada para proyectar la cuadrícula de la transformación de la cámara que se utiliza para representar la cuadrícula. En perspectivas cercanas a arriba hacia abajo, las dos cámaras coinciden, pero a medida que la cámara de visualización se acerca a una perspectiva horizontal, la cámara de proyección se desvía e intenta mantener una inclinación mínima, es decir, se sitúa en algún lugar por encima de la cámara de visión y mira hacia abajo ligeramente.

La parte difícil es asegurarse de que el campo de visión de la cámara de proyección siempre cubra la región de la escena vista desde la cámara de renderizado. No tengo un recurso a mano que detalle cómo calcular las transformaciones apropiadas, y podría ser tedioso derivarlo a mano.

Una solución diferente es tomar la caja de herramientas de procesamiento de señal: los artefactos que se ven en su imagen son esencialmente alias, causados ​​por un muestreo insuficiente del campo de altura de onda por la cuadrícula proyectada. Por lo tanto, una solución es filtrar el campo de altura apropiadamente, dependiendo del área proyectada de una celda de cuadrícula. Creo que esto se usa en la representación fuera de línea de los océanos, y esencialmente se asegura de que las olas en el horizonte se desinflen. Sin embargo, no estoy seguro de qué tan factible es esto en el renderizado en tiempo real, ya que necesitaría un filtro anisotrópico de alta calidad para que este enfoque parezca razonable.

Benedikt Bitterli
fuente
Gracias por el consejo, elegí la solución perezosa por ahora. Uso una función en el sombreador de vértices que determina la atenuación de la onda desde la distancia desde la cámara.
Gábor Szalóki
6

Puedes ser realista y en tiempo real. el secreto es cambiar la representación cada vez que la información se encuentra bajo la escala de Shannon-Nyquist (es decir, la cuadrícula): de la geometría a los mapas normales a los modelos de sombreado. Este documento está hecho para usted: http://maverick.inria.fr/Publications/2010/BNH10/index.php (vea también los videos de Yoube)

Fabrice NEYRET
fuente
3

Algunos softwares como Maya resuelven esto usando un polar (o en realidad cartesiano que se vuelve polar a distancia) de la misma manera que la cuadrícula centrada en la posición de la cámara. Esta configuración agrega más detalles donde más cuenta. Luego confían en el procesamiento normal de los sombreadores en otros rangos. Hay espacio para mejorar la salida de red. Modifica un poco este enfoque en frío y tiene cualquier otra forma que aumente la densidad de la malla hacia la cámara. El beneficio de esto es que puede estirar el efecto hasta el horizonte sin preocuparse por la costura.

El truco para no confundir el desplazamiento en este caso es que reduce gradualmente el desplazamiento a medida que se aleja. Luego, solo usa la modificación normal en el sombreador de píxeles a medida que avanza. Esto es más fácil de filtrar que tener que filtrar un borde de shiluette preciso. Además, si puede ver tan lejos, sus vasijas probablemente sean lo suficientemente planas de todos modos.

joojaa
fuente