Calcomanías diferidas problema normal

11

He estado trabajando en un sistema de calcomanías diferidas. Hasta ahora he terminado la parte de proyección, lo que significa que puedo hacer clic en algo en la escena y proyectará correctamente una calcomanía en la superficie del objeto.

Hay un par de otras cosas que deseo agregar a este sistema: recorte normal y calcomanías mapeadas normales. El recorte normal es cuando descarto fragmentos que se estiran en un ángulo agudo. Visto aquí . Una forma de resolver esto es descartar fragmentos que tienen una gran diferencia entre lo normal en el G-Buffer y lo normal de la calcomanía. Esto requeriría leer la textura normal del G-buffer.

Para hacer un mapeo normal de calcomanías, necesito mezclar la calcomanía normal (de un mapa normal) con la normal del G-buffer. El requiere escribir en la textura normal del G-buffer.

Espero que esté claro que para admitir estas dos características, necesito leer y escribir en la textura normal en el mismo paso de sombreado. Lamentablemente, este es un comportamiento indefinido, por lo que me pregunto si hay alguna otra forma de implementar estas características.

Ian
fuente

Respuestas:

1

¿Qué sistema de renderizado utilizas? La siguiente información debería ser válida para todos los sistemas de renderizado, pero en DX11 o versiones posteriores de OpenGL podría haber una mejor solución usando los UAV.

-

Tendrá que copiar el búfer normal antes de cada pase. Siempre que sepa que las calcomanías no modifican los mismos fragmentos de espacio de pantalla, no tiene que actualizar la copia.

También puede convertir todas sus calcomanías en búferes separados y solo hacer una pasada de mezcla en su búfer normal usando una sola copia de búfer normal. Esto aumentaría mucho mejor con la cantidad de calcomanías que tiene.

Mientras no escriba el búfer normal, por ejemplo, solo realice un recorte normal, como lo llama, puede simplemente probar el búfer normal original pero no puede vincularlo como un destino de representación.

En DX9 descubrí que leer y escribir con la misma textura da como resultado la salida esperada siempre que solo use el filtrado de puntos más cercano y nunca lea un píxel diferente al que está escribiendo actualmente, ¡PERO! Como este es un comportamiento indefinido, puede haber controladores y tarjetas gráficas que no se comporten de esta manera. DX10 evitará que haga esto al desvincular las texturas actualmente vinculadas como objetivos de representación.

Archy
fuente