Sombreador de plástico translúcido HLSL

12

Estoy tratando de producir un sombreador para replicar un objeto de plástico blanco con una luz de color en el interior. Ya sea por tener un sombreador que sea translúcido y si pongo una luz dentro del objeto, la luz se verá a través o al tener un sombreador que simula el efecto de una luz dentro.

El efecto que busco es como una luz que pasa a través de una pantalla de lámpara similar a estas imágenes:

texto alternativo texto alternativo texto alternativo

Idealmente, sería capaz de controlar la fuerza y ​​el color de la luz para hacerla pulsar y rotar a través de algunos bonitos colores brillantes.

¡Aunque no estoy seguro de por dónde empezar!

Mi pregunta es: ¿alguien sabe las técnicas que debería investigar para poder producir un sombreador de este tipo o tener un ejemplo del mismo / similar sombreador que pueda usar como punto de partida? O incluso si desea proporcionar un sombreador que pueda hacer el trabajo

Tristan
fuente

Respuestas:

10

Este es un efecto conocido como "Dispersión de sub-superficie".

Hay un ejemplo de implementación de espacio en pantalla de esto en el libro "GPU Pro: Técnicas avanzadas de renderizado" que es adecuado para uso en tiempo real.

Tony McCrary
fuente
0

No sé HLSL, así que no puedo dar una respuesta exacta. Lo que básicamente puedes hacer es establecer el color de cada fragmento dependiendo de la distancia desde la fuente de luz (ignorando cualquier sombra propia).

En pseudocódigo sería algo como esto:

fragment_color = light_intensity * transparent_color * lightsource_color / (atenuation * distance_to_lightsource ^ 2)

También es posible que desee utilizar un factor de atenuación lineal además del cuadrado para que la luz se extienda más.

Danik
fuente
0

¿La luz necesita poder moverse, y el objeto necesita poder deformarse / animarse? Si ninguno de estos es el caso, una forma barata de hacerlo sería aplicar un mapa de textura monocromático sobre el objeto que actúe como una máscara para la luz; en el sombreador, probaría esta textura, multiplíquela por el color / intensidad de la luz actual y agréguela al color de salida.

La pregunta de seguimiento obvia es ¿cómo generará esta textura? Puede intentar pintarlo, si tiene acceso a un artista o puede pintar texturas usted mismo. También podría ser renderizado por una herramienta fuera de línea usando raytracing o algo así. Sin embargo, no estoy lo suficientemente familiarizado con las herramientas de trazado de rayos para decirle en detalle cómo configurarlo.

Un enfoque diferente podría ser escribir un sombreador que muestree la luz detrás de él, utilizando la superficie inversa normal en la ecuación de sombreado difuso de Lambert; luego lo multiplicaría por un factor de máscara como 0.5 y lo agregaría al color de salida. Esto permitiría mover dinámicamente la luz o la geometría, y no requeriría texturas, pero probablemente no obtendría resultados tan atractivos como un render sin conexión.

Con respecto a la dispersión subsuperficial: no creo que eso sea precisamente lo que se quiere aquí porque todos los algoritmos SSS para gráficos que he visto están diseñados para la luz que proviene de fuera de la superficie, rebota un poco y sale nuevamente, mientras que aquí la luz está adentro .

Nathan Reed
fuente