Explicación detallada de la disolución por ablación en UnityShaderBook

El efecto de ablación puede considerarse como uno de los efectos más utilizados en el desarrollo de juegos. A menudo se utiliza cuando el objeto del juego desaparece. Se acabó, aquí quiero explicar en detalle los efectos del libro.

Código fuente de Shader , no publicaré el código fuente aquí, puedes seguirlo.

El núcleo del efecto de ablación es usar la función de recorte para recortar píxeles más pequeños que el umbral

 En primer lugar, Disslove contiene dos pases, uno para el renderizado directo y otro para el renderizado de sombras, que analizaremos uno por uno a continuación.

Descripción de parámetros

 

Existen principalmente mapas de ruido y umbrales relacionados con el efecto de ablación. Estos dos pueden lograr la ablación.En el libro, Burn Line Width, Burn First Color y Burn Second Color se usan adicionalmente para lograr el efecto de quemar la superficie antes de la ablación.

mapa de ruido

El mapa de ruido utilizado aquí es similar a un mapa de ruido gaussiano, y el uso de este tipo de mapa de ruido puede hacer que la transición de la ablación sea más suave y uniforme. Aunque este libro trata sobre el efecto de ablación, creo que la selección y el uso de mapas de ruido también es una puerta que vale la pena estudiar. Siempre que se ajuste aproximadamente a la ley del gráfico de ruido gaussiano, se pueden lograr mejores resultados. Siempre que tomemos los píxeles en el mapa de ruido, podemos encontrar que son puntos de aumento o disminución de gradiente, lo que está en línea con la ley de quemar cosas, extendiéndose desde múltiples puntos.

sombreador de vértices fwdbase

El sombreador de vértices no tiene nada que explicar, el cálculo de la textura uv, el cálculo de la dirección de la luz en el espacio tangente y el cálculo de las coordenadas del mundo no tienen nada que explicarte a ti que has leído el libro durante tanto tiempo.

sombreador de fragmentos fwdbase

Aunque solo sea para lograr la ablación, se puede lograr el siguiente código

fixed4 frag(v2f i) : SV_Target
{
		//1.采样噪声图
    fixed3 burn = tex2D(_BurnMap, i.uvBurnMap).rgb;
		//2.根据当前Burn(燃烧进度)裁剪片元
    clip(burn.r - _BurnAmount);
		//计算切线空间下的光照方向与法线
		//法线通过UnpackNormal获取,因为需要将采样值映射到[-1,1]区间
		//光照方向就是顶点着色器计算后插值后的结果,在frag中再归一化,可以避免精度丢失
    float3 tangentLightDir = normalize(i.lightDir);
    fixed3 tangentNormal = UnpackNormal(tex2D(_BumpMap, i.uvBumpMap));
		//3.采样反照率纹理
    fixed3 albedo = tex2D(_MainTex, i.uvMainTex).rgb;
    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
		//计算漫反射,采用半兰伯特
    fixed3 diffuse = _LightColor0.rgb * albedo * max(0, 0.5 * dot(tangentNormal, tangentLightDir) + 0.5);
    UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
    fixed3 finalColor = ambient + diffuse * atten;
    return fixed4(finalColor, 1);
}

La única diferencia entre esto y la iluminación al comienzo del libro es que los píxeles se recortan para lograr el efecto de ablación, entonces, ¿por qué el efecto de ablación es tan simple? Solo existe una oración así.

Se agregó una pequeña dificultad en el libro para hacer que el efecto de quemado sea más realista y darse cuenta del área quemada.

//burn.r在这里一定大于_BurnAmount
//_LineWidth区间为[0,0.2]
//smoothstep结果为(0,1]区间内
	//当burn.r - _BurnAmount > _LineWidth时最终t为0,说明火还没烧过来
	//否则存在线性变换
//这里就刚好符合在LineWidth外没有燃烧痕迹的需求
fixed t = 1 - smoothstep(0.0, _LineWidth, burn.r - _BurnAmount);

//在燃烧范围内存在渐进变换
fixed3 burnColor = lerp(_BurnFirstColor, _BurnSecondColor, t);
//增加亮度和对比度
burnColor = pow(burnColor, 5);

UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
fixed3 finalColor = lerp(ambient + diffuse * atten, burnColor, t * step(0.0001, _BurnAmount));

El análisis específico de cada oración que escribí en el código anterior. Aquí hay una adición adicional a la función de calcular el cálculo de potencia para burnColor. En la oración original del libro, "Para hacer que el efecto se acerque más al rastro quemado, también usamos la función pow para procesar el resultado". la oración no dice por qué, lo cual es muy incómodo .

El objetivo de potenciar un color suele ser ajustar aspectos del color como el brillo, el contraste o la saturación. La operación de energía puede hacer que el valor del color cambie de forma no lineal, para lograr un efecto de ajuste de color más fino.

Por ejemplo, elevar el valor de un color a una potencia de 2 puede aumentar el brillo y el contraste del color. La operación de potencia del valor de color inferior a 1 puede reducir el brillo y el contraste del color y aumentar la saturación al mismo tiempo.

Además, la exponenciación también se puede utilizar para la conversión del espacio de color de los colores, como la corrección gamma de los valores de color para lograr un rendimiento de color más natural. 

lanzador de sombras

Este pase es similar a fwdbase y también recorta los píxeles ablacionados.

Supongo que te gusta

Origin blog.csdn.net/weixin_36719607/article/details/130515939
Recomendado
Clasificación