Erste Schritte mit Unity Shader Grundlegende Lesehinweise_Grundlegende Beleuchtung


Vorwort

Beginnend mit der Grundschule


1. Beginnen Sie mit dem Erlernen von Unity Shader

1.1 Die Grundstruktur von Unity Shader:

Fügen Sie hier eine Bildbeschreibung ein

1.2 Eine Einführung

Es ist sehr nervig. Es ist ein Fehler, wenn es auftaucht. Der Code ist genau derselbe. Mein Ball ist rot. Ich vermute, dass es sich um ein Zielproblem handelt:Fügen Sie hier eine Bildbeschreibung ein

Der Grund für diesen Fehler ist, dass die Ausgabe der Funktion frag() nicht korrigiert, sondern behoben ist.4 Ich habe gerade
erfahren, dass es sich wahrscheinlich um einen Tippfehler handelte

//shader名称
Shader "Custom/SimpleShader"{
	SubShader{
		pass{
			CGPROGRAM
			//定义顶点着色器和片元着色器函数
			#pragma vertex vert
			#pragma fragment frag
			
			//输入:POSITION,定义为v, 输出到SV_POSITION 中
			float4 vert(float4 v : POSITION): SV_POSITION{
				return UnityObjectToClipPos(v);
			}
			// SV_TARGET,渲染目标,储存到一个帧缓存器中
			fixed4 frag() : SV_Target{
				return fixed4(1.0 , 1.0 ,1.0 , 1.0);
			}
			ENDCG
		}
	}
}

Die Strukturstruktur
definiert eine Struktur
Fügen Sie hier eine Bildbeschreibung einFügen Sie hier eine Bildbeschreibung ein
zur umfassenden Verwendung

Shader "Unity Shaders Book/Chapter 5/Simple Shader" {
	Properties {
		_Color ("Color Tint", Color) = (1, 1, 1, 1)
	}
	SubShader {
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            
            uniform fixed4 _Color;

			struct a2v {
                float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
            };
            
            struct v2f {
                float4 pos : SV_POSITION;
                fixed3 color : COLOR0;
            };
            
            v2f vert(a2v v) {
            	v2f o;
            	o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            	o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target {
            	fixed3 c = i.color;
            	c *= _Color.rgb;
                return fixed4(c, 1.0);
            }

            ENDCG
        }
    }
}

1.3 Zusammenfassung: Integrierte Unity-Variablen

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

2. Grundbeleuchtung

2.1 Grundlagen visueller Prinzipien

  • Lichtstrahlen breiten sich von einer Lichtquelle aus
  • Licht wird von einem Objekt absorbiert und von diesem in alle anderen Richtungen gestreut
  • Die Kamera empfängt die Glasfaser und erzeugt ein Bild

Ein paar Substantive:

  • Bestrahlungsstärke (Bestrahlungsstärke): Quantifiziertes Licht, um den Kosinuswert des Winkels zwischen der Lichtquellenrichtung und der Flächennormalen v zu erhalten
  • Spiegelreflexion: Wie die Oberfläche eines Objekts Licht reflektiert
  • Diffus: Wie viel Licht wird durch Brechung absorbiert und gestreut?
  • Austrittsgrad: Anzahl und Richtung der ausgehenden Strahlen
  • BRDF: Bidirektionales Streuverteilungsmodell, das später erwähnt wird

2.2 Standardbeleuchtungsmodell

Konzentrieren Sie sich nur auf direkte Beleuchtung

Er teilt das in die Kamera einfallende Licht in vier Teile

  • Selbstbeleuchtung, die beschreibt, wie viel Strahlung eine Oberfläche in einer bestimmten Richtung selbst in diese Richtung aussendet
  • Spiegelreflexion
  • diffuse Reflexion
  • Umgebungslicht, das alle anderen indirekten Beleuchtungen beschreibt

Als nächstes folgen einige Berechnungsformeln

  • Umgebungslicht ist normalerweise eine globale Variable, die von allen Objekten verwendet wird, um indirekte Beleuchtung zu simulieren
  • Selbstbeleuchtung, nutzen Sie direkt die Selbstbeleuchtungsfarbe des Materials
  • Fügen Sie hier eine Bildbeschreibung ein
  • Specular ist das empirische Modell
    Fügen Sie hier eine Bildbeschreibung ein

2.3 Modell mit diffuser Beleuchtung

Scheitelpunkt-für-Scheitelpunkt-Version

Shader "Unity Shaders Book/Chapter 6/Diffuse Vertex-Level" {
	Properties {
	// 定义漫反射颜色,初始值白色
		_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
	}
	SubShader {
		Pass { 
		// 指定该pass的光照模式,定义该pass在unity的光照流水线中的角色
			Tags { "LightMode"="ForwardBase" }
		
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			//为了使用内置变量引入库
			#include "Lighting.cginc"
			// 使用properties的变量
			fixed4 _Diffuse;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				fixed3 color : COLOR;
			};
			
			v2f vert(a2v v) {
				v2f o;
				// Transform the vertex from object space to projection space
				o.pos = UnityObjectToClipPos(v.vertex);
				
				// Get ambient term
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				
				// Transform the normal from object space to world space
				fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
				// Get the light direction in world space
				fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);
				// Compute diffuse term
				//内置变量lightcolor0 访问该pass处理的光源的颜色和强度信息
				//光源方向可以由_WorldSpaceLightPos0
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));
				
				o.color = ambient + diffuse;
				
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				return fixed4(i.color, 1.0);
			}
			
			ENDCG
		}
	}
	FallBack "Diffuse"
}

In der Pixel-für-Pixel-Version übergibt der Vertex-Shader die Positionsinformationen der Weltnormalen und des Beschneidungsraums, und die Berechnung der festen 4-Farbe wird im Fragment-Shader abgeschlossen

2.4 Semi-Lambert-Modell

Bei dem obigen Modell gibt es ein Problem.
Fügen Sie hier eine Bildbeschreibung ein
In dem Bereich, den das Licht nicht erreichen kann, ist das Modell unverändert rein schwarz. Es sieht aus wie ein Flugzeug

Die Formel des Semi-Lambert-Beleuchtungsmodells lautet wie folgt
Fügen Sie hier eine Bildbeschreibung ein

  • Er erstellte eine Karte des Skalarprodukts der Oberflächennormalen und des einfallenden Lichts, anstatt den Maximalwert zu nehmen und den negativen Teil vollständig wegzuwerfen
  • Im Allgemeinen gilt α = β = 0,5 \alpha = \beta = 0,5A=B=0,5 , wird auf[ 0 , 1 ][0,1][ 0 ,1 ]

Der Effekt sieht so aus
Fügen Sie hier eine Bildbeschreibung ein

2.5 Spiegelreflexionsbeleuchtungsmodell

Fügen Sie hier eine Bildbeschreibung ein

  • Die Farbe und Intensität des einfallenden Lichts
  • Das spiegelnde Reflexionsvermögen des Materials
  • Blickrichtung
  • Reflexionsrichtung
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Unity Shaders Book/Chapter 6/Specular Vertex-Level" {
	Properties {
		_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
		_Specular ("Specular", Color) = (1, 1, 1, 1)
		_Gloss ("Gloss", Range(8.0, 256)) = 20
	}
	SubShader {
		Pass { 
			Tags { "LightMode"="ForwardBase" }
			
			CGPROGRAM
			
			#pragma vertex vert
			#pragma fragment frag
			
			#include "Lighting.cginc"
			
			fixed4 _Diffuse;
			fixed4 _Specular;
			float _Gloss;
			
			struct a2v {
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};
			
			struct v2f {
				float4 pos : SV_POSITION;
				fixed3 color : COLOR;
			};
			
			v2f vert(a2v v) {
				v2f o;
				// Transform the vertex from object space to projection space
				o.pos = UnityObjectToClipPos(v.vertex);
				
				// Get ambient term
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;
				
				// Transform the normal from object space to world space
				//注意左乘右乘
				fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));
				// Get the light direction in world space
				fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
				
				// Compute diffuse term
				fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));
				
				// 获得反射光线
				fixed3 reflectDir = normalize(reflect(-worldLightDir, worldNormal));
				// 视角方向
				fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - mul(unity_ObjectToWorld, v.vertex).xyz);
				
				// Compute specular term
				fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(reflectDir, viewDir)), _Gloss);
				
				o.color = ambient + diffuse + specular;
							 	
				return o;
			}
			
			fixed4 frag(v2f i) : SV_Target {
				return fixed4(i.color, 1.0);
			}
			
			ENDCG
		}
	} 
	FallBack "Specular"
}

Der Effekt ist wie in der Abbildung dargestellt
Fügen Sie hier eine Bildbeschreibung ein

2.6 Bryn Fon-Modell

Verwendung von Halbbereichsvektoren
Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

2.7 Hilfsfunktionen

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/woshi_wst/article/details/128528559
Empfohlen
Rangfolge