Eine ausführliche Erläuterung der Ablationsauflösung finden Sie im UnityShaderBook

Der Ablationseffekt kann als einer der am häufigsten verwendeten Effekte in der Spieleentwicklung angesehen werden. Er wird häufig verwendet, wenn das Spielobjekt verschwindet. Es ist vorbei, hier möchte ich die Effekte im Buch ausführlich erläutern.

Shader-Quellcode . Ich werde den Quellcode hier nicht veröffentlichen, Sie können ihm folgen.

Der Kern des Ablationseffekts besteht darin, mithilfe der Clip- Funktion Pixel auszuschneiden, die kleiner als der Schwellenwert sind

 Zunächst enthält Disslove zwei Durchgänge, einen für das Vorwärts-Rendering und einen für das Schatten-Rendering, die wir im Folgenden einzeln analysieren werden.

Parameterbeschreibung

 

Es gibt hauptsächlich Lärmkarten und Schwellenwerte, die sich auf den Ablationseffekt beziehen. Diese beiden können eine Ablation erreichen. In dem Buch werden zusätzlich „Burn Line Width“, „Burn First Color“ und „Burn Second Color“ verwendet, um den Effekt des Brennens der Oberfläche vor der Ablation zu erzielen.

Lärmkarte

Die hier verwendete Rauschkarte ähnelt einer Gaußschen Rauschkarte, und die Verwendung dieser Art von Rauschkarte kann den Ablationsübergang glatter und gleichmäßiger machen. Obwohl es in diesem Buch um den Ablationseffekt geht, denke ich, dass die Auswahl und Verwendung von Lärmkarten auch einen Einstieg wert ist, der studiert werden sollte. Solange es ungefähr dem Gesetz des Gaußschen Rauschdiagramms entspricht, können bessere Ergebnisse erzielt werden. Solange wir die Pixel in der Rauschkarte aufnehmen, können wir feststellen, dass es sich um Punkte mit zunehmendem oder abnehmendem Gradienten handelt, was dem Gesetz des Brennens von Dingen entspricht und sich von mehreren Punkten aus ausbreitet

fwdbase-Vertex-Shader

Der Vertex-Shader hat nichts zu erklären, die Berechnung der UV-Textur, die Berechnung der Lichtrichtung im Tangentenraum und die Berechnung der Weltkoordinaten haben Ihnen, die das Buch schon so lange gelesen haben, nichts zu erklären.

fwdbase-Fragment-Shader

Wenn nur eine Ablation erreicht werden soll, kann der folgende Code implementiert werden

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);
}

Der einzige Unterschied zur Beleuchtung am Anfang des Buches besteht darin, dass die Pixel ausgeschnitten werden, um den Ablationseffekt zu erzielen. Warum ist der Ablationseffekt also so einfach? Es gibt nur einen solchen Satz.

Dem Buch wurde eine kleine Schwierigkeit hinzugefügt, um den Brenneffekt realistischer zu gestalten und den verbrannten Bereich zu erkennen

//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));

Die spezifische Analyse jedes Satzes, den ich im obigen Code geschrieben habe. Hier ist eine zusätzliche Ergänzung zur Funktion zur Berechnung der Leistungsberechnung für burnColor. Im Originalsatz des Buches: „Um den Effekt näher an die verbrannte Spur zu bringen, verwenden wir auch die pow-Funktion, um das Ergebnis zu verarbeiten.“ Dies Der Satz sagt nicht warum, was den Leuten Unbehagen bereitet .

Der Zweck der Potenzierung einer Farbe besteht normalerweise darin, Aspekte der Farbe wie Helligkeit, Kontrast oder Sättigung anzupassen. Der Leistungsbetrieb kann dazu führen, dass sich der Farbwert nichtlinear ändert, um so einen feineren Farbanpassungseffekt zu erzielen.

Wenn Sie beispielsweise einen Farbwert auf eine Potenz von 2 erhöhen, können Helligkeit und Kontrast der Farbe erhöht werden. Der Leistungsbetrieb mit einem Farbwert von weniger als 1 kann die Helligkeit und den Kontrast der Farbe verringern und gleichzeitig die Sättigung erhöhen.

Darüber hinaus kann die Potenzierung auch zur Farbraumkonvertierung von Farben verwendet werden, z. B. zur Gammakorrektur von Farbwerten, um eine natürlichere Farbleistung zu erzielen. 

Schattenwerfer

Dieser Pass ähnelt fwdbase und beschneidet auch die abgetragenen Pixel

Ich denke du magst

Origin blog.csdn.net/weixin_36719607/article/details/130515939
Empfohlen
Rangfolge