Shader Graph 16.0.3 中有 208 個 Node(節點),本文梳理了 Shader Graph 中大部分 Node 的釋義,官方介紹詳見→Node-Library。
選中節點後,右鍵彈出選單欄,點選 Open Documentation(或 按 F1 鍵),瀏覽器中將跳轉到該節點的官方釋義網頁。
Shader Graph 通過影象的形式表達了頂點變換和片元著色流程,其背後都是一系列的數學理論支撐著,為更好地理解 Shader Graph 中的 Node,推薦讀者學習以下內容。
Artistic 官方介紹詳見→Artistic Nodes。
1)Channel Mixer(通道混合)
Channel Mixer 節點用於通道混合,根據混合權重對每個通道進行混合,_ChannelMixer_Red、_ChannelMixer_Green、_ChannelMixer_Blue 分別為紅色、綠色、藍色通道的權重向量。
void ChannelMixer(float3 In, float3 _ChannelMixer_Red, float3 _ChannelMixer_Green, float3 _ChannelMixer_Blue, out float3 Out) {
Out = float3(dot(In, _ChannelMixer_Red), dot(In, _ChannelMixer_Green), dot(In, _ChannelMixer_Blue));
}
2)Contrast(調整對比度)
Contrast 節點用於調整對比度。
void Contrast(float3 In, float Contrast, out float3 Out) {
float midpoint = pow(0.5, 2.2); // 約等於0.217638
Out = (In - midpoint) * Contrast + midpoint;
}
說明:midpoint = pow(0.5, 2.2) 是對 0.5 進行了伽馬編碼(詳見伽馬校正),解決亮度異常問題。
3)Hue(調整色相)
Hue 節點用於調整色相,其實現見→Hue Node。
void Hue(float3 In, float Offset, out float3 Out)
說明:色相調整有 2 種模式:Degrees、 Normalized。在視覺化介面中,色相的調整一般通過色相環實現,offset 就對應色相環中的角度,在 Degrees 模式下,offset 取值範圍是 0 ~ 360°,在 Normalized 模式下,offest 取值範圍是 0 ~ 1。
4)Invert Colors(反轉顏色)
Invert Colors 節點用於反轉顏色。
void InvertColors(float4 In, float4 InvertColors, out float4 Out) {
Out = abs(InvertColors - In);
}
5)Replace Color(替換顏色)
Replace Color 節點用於替換顏色,如果輸入顏色與 From 顏色比較接*,就將輸入顏色替換為 To 顏色,Range 是輸入顏色被替換的邊界,Fuzziness 是模糊係數。
void ReplaceColor(float3 In, float3 From, float3 To, float Range, float Fuzziness, out float3 Out) {
float Distance = distance(From, In);
Out = lerp(To, In, saturate((Distance - Range) / max(Fuzziness, 1e-5))); // 1e-5=0.00001, 避免Fuzziness為0時除數為0
}
6)Saturation(調整飽和度)
Saturation 節點用於調整飽和度。
void Saturation(float3 In, float Saturation, out float3 Out) {
float luma = dot(In, float3(0.2126729, 0.7151522, 0.0721750));
Out = luma.xxx + Saturation.xxx * (In - luma.xxx);
}
7)White Balance(調整白*衡)
White Balance 節點用於調整白*衡,其實現見→White Balance Node,Temperature 用於調整色溫,Tint 用於調整色調。
void WhiteBalance(float3 In, float Temperature, float Tint, out float3 Out)
Blend 節點用於混合兩種顏色。
Mode 取值有:Burn、Darken、Difference、Dodge、Divide、Exclusion、Hard Light、Hard Mix、Lighten、Linear Burn、Linear Dodge、Linear Light、Linear Light Add Sub、Multiply、Negation、Overlay(預設值)、Pin Light、Screen、Soft Light、Subtract、Vivid Light、Overwrite。不同 Mode 對應的混合函數詳見→Blend Node。
Filter 裡只有一個 Node:Dither,它用於模擬顏色隨機振動,它通過一個 4 x 4 的矩陣模擬偽隨機振動,這個矩陣的每一行和每一列都呈波浪狀(一大一小交錯排列)。
void Dither(float4 In, float4 ScreenPosition, out float4 Out) {
float2 uv = ScreenPosition.xy * _ScreenParams.xy;
float DITHER_THRESHOLDS[16] = {
1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0,
13.0 / 17.0, 5.0 / 17.0, 15.0 / 17.0, 7.0 / 17.0,
4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0,
16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0
};
uint index = (uint(uv.x) % 4) * 4 + uint(uv.y) % 4;
Out = In - DITHER_THRESHOLDS[index];
}
說明:對於 ScreenPosition 的取值,使用者可以自己輸入,也可以使用 Unity 自帶的取值,主要有:Default、Raw、Center、Tiled。
1)Channel Mask(通道遮罩)
Channel Mask 節點用於遮罩通道,將被遮罩的通道置為 0,如下是將 RG 通道遮罩的程式碼邏輯。
void ChannelMask_RedGreen(float4 In, out float4 Out) {
Out = float4(0, 0, In.b, In.a);
}
2)Color Mask(顏色遮罩)
Color Mask 節點用於顏色遮罩,計算輸入顏色與目標顏色的*似程度,比較接*就輸出 1,偏移比較大就輸出 0。
void ColorMask(float3 In, float3 MaskColor, float Range, float Fuzziness, out float4 Out) {
float Distance = distance(MaskColor, In);
Out = saturate(1 - (Distance - Range) / max(Fuzziness, 1e-5)); // 1e-5=0.00001, 避免Fuzziness為0時除數為0
}
1)Normal Blend(法線混合)
Normal Blend 有 2 種模式:Default、Reoriented。
void NormalBlend(float3 A, float3 B, out float3 Out) { // Default模式
Out = normalize(float3(A.rg + B.rg, A.b * B.b));
}
void NormalBlend_Reoriented(float3 A, float3 B, out float3 Out) { // Reoriented模式
float3 t = A.xyz + float3(0.0, 0.0, 1.0);
float3 u = B.xyz * float3(-1.0, -1.0, 1.0);
Out = (t / t.z) * dot(t, u) - u;
}
2)Normal From Height(由高度值轉換為法線紋理)
Normal From Height 節點用於將輸入的高度值轉換到法線紋理中。Output Space(輸出空間)有:Tangent(切線空間)、World(世界空間)。原始碼詳見→Normal From Height Node,它通過對 Position、In 求 ddx 和 ddy 等運算得到法線值。
void NormalFromHeight(float In, out float3 Out)
3)Normal From Texture(由高度紋理轉換為法線紋理)
Normal From Texture 節點用於將高度紋理轉換為法線紋理。Offset 為高度取樣 uv 偏移量,Strength 用於調整法線強度(物體表面凹凸程度)。
void NormalFromTexture(Texture texture, SamplerState Sampler, float2 UV, float Offset, float Strength, out float3 Out) {
Offset = pow(Offset, 3) * 0.1;
float2 offsetU = float2(UV.x + Offset, UV.y);
float2 offsetV = float2(UV.x, UV.y + Offset);
float normalSample = Texture.Sample(Sampler, UV);
float uSample = Texture.Sample(Sampler, offsetU);
float vSample = Texture.Sample(Sampler, offsetV);
float3 va = float3(1, 0, (uSample - normalSample) * Strength); // 切線(高度圖1m一個畫素)
float3 vb = float3(0, 1, (vSample - normalSample) * Strength); // 切線(高度圖1m一個畫素)
Out = normalize(cross(va, vb)); // 通過2條切線向量叉乘得到法線向量
}
4)Normal Reconstract Z(法線重構)
Normal Reconstract Z 節點用於重構法線向量,原來的 z 分量被拋棄,由 x、y 分量推匯出,再對法線向量進行歸一化。
void NormalReconstructZ(float2 In, out float3 Out) {
float reconstructZ = sqrt(1.0 - saturate(dot(In.xy, In.xy)));
float3 normalVector = float3(In.x, In.y, reconstructZ);
Out = normalize(normalVector);
}
5)Normal Strength(調整物體表面凹凸程度)
Normal Strength 節點用於調整法線強度(物體表面凹凸程度,案例見→法線貼圖和凹凸對映)。注意,調整法線向量後需要歸一化法線向量。
void NormalStrength(float3 In, float Strength, out float3 Out) {
Out = {precision}3(In.rg * Strength, lerp(1, In.b, saturate(Strength)));
}
說明:"{precision}3" 是一個類似於建構函式的語法,用於構建一個包含 3 個分量的向量。
6)Normal Unpack(由法線紋理解碼法線向量)
Normal Unpack 節點用於從法線紋理中解碼法線向量。Output Space(輸出空間)有:Tangent(切線空間)、Object(模型空間)。
void NormalUnpack(float4 In, out float3 Out) { //Tangent
Out = UnpackNormalmapRGorAG(In);
}
void NormalUnpackRGB(float4 In, out float3 Out) { // Object
Out = UnpackNormalmapRGB(In);
}
Utility 中只有 Colorspace Conversion 節點,用於進行 RGB、Linear、HSV 顏色空間之間的相互轉換,原始碼詳見→Colorspace Conversion Node。
Channel 官方介紹詳見→Channel Nodes。
1)Combine(合併通道)
Combine 節點用於合併通道。
void Combine(float R, float G, float B, float A, out float4 RGBA, out float3 RGB, out float2 RG) {
RGBA = float4(R, G, B, A);
RGB = float3(R, G, B);
RG = float2(R, G);
}
2)Flip(翻轉通道)
Flip 節點用於翻轉通道,即相應通道數值取反,Flip 取值為 0(未啟用)或 1(啟用)。
void Flip(float4 In, float4 Flip, out float4 Out) {
Out = (Flip * -2 + 1) * In;
}
3)Split(分離通道)
Split 節點用於分離通道,以下是輸入為 2 維的情況,如果輸入維數低於輸出維數,高維通道補零輸出。
void Split(float2 In, out float R, out float G, out float B, out float A) {
R = In[0];
G = In[1];
B = 0;
A = 0;
}
4)Swizzle(交換通道)
Swizzle 節點用於交換通道,根據 Mask 中通道的順序重組通道。如下是其中一種交換方式。
float4 _Swizzle_Out = In.xzyw;
Input 官方介紹詳見→Input Nodes。
Basic 中是一些基礎的變數節點,如:Boolean、Constant、Float、Integer、Slider、Time、Color、Vector2、Vector3、Vector4。
Geometry 中提供了存取頂點或片元幾何屬性的節點,如:Position、Screen Position、UV、Vertex Color、Tangent Vector、Bitangent Vector、Normal Vector、View Direction、View Vector。
Screen Position 不同模式下的實現如下。
// Default, 歸一化的裝置座標(NDC), x、y值域: [0, 1], 可以用於顏色緩衝區(Scene Color)的uv座標
float4 Out = float4(IN.NDCPosition.xy, 0, 0);
// Raw, 螢幕座標, x值域: [0, w], y值域: [0, w]
float4 Out = IN.ScreenPosition;
// Center, 標準化的裝置座標, x、y值域: [-1, 1]
float4 Out = float4(IN.NDCPosition.xy * 2 - 1, 0, 0);
// Tiled, x值域: [-screenWidth/screenHeight, screenWidth/screenHeight], y值域: [-1, 1]
float4 Out = frac(float4((IN.NDCPosition.x * 2 - 1) * _ScreenParams.x / _ScreenParams.y, IN.{0}.y * 2 - 1, 0, 0));
// Pixel, 畫素座標, x值域: [0, screenWidth], y值域: [0, screenHeight]
float4 Out = float4(IN.PixelPosition.xy, 0, 0);
Blackbody、Gradient、Sample Gradient 節點都是用於生成漸變顏色。
1) Blackbody(黑體輻射漸變取樣)
Blackbody 節點通過模擬黑體輻射漸變取樣得到漸變顏色,其實現見→Blackbody Node,它基於 Mitchell Charity 收集的資料,輸出線性 RGB 空間的顏色,並使用一個 D65 白點和一個 CIE 1964 10 度的顏色空間執行轉換,Temperature 為取樣的溫度或溫度貼圖(以開爾文為單位)。
void Blackbody(float Temperature, out float3 Out)
2)Gradient(生成漸變物件)
Gradient 節點用於生成 Gradient 漸變物件,它通過 2 個 Color 和 2 個 Alpha 引數計算得到,實現見→Gradient Node。
3)Sample Gradient(漸變取樣)
Sample Gradient 節點用於對 Gradient 進行漸變取樣,其實現見→Sample Gradient Node,Time 為取樣漸變的時間點 (0.0–1.0)。
void SampleGradient(float4 Gradient, float Time, out float4 Out)
1)Ambient(環境光)
Ambient 節點用於獲取環境光顏色。
float3 _Ambient_ColorSky = SHADERGRAPH_AMBIENT_SKY;
float3 _Ambient_Equator = SHADERGRAPH_AMBIENT_EQUATOR;
float3 _Ambient_Ground = SHADERGRAPH_AMBIENT_GROUND;
2)Baked GI(烘焙的全域性光照)
Baked GI 節點用於獲取烘焙的全域性光照顏色,Position 為頂點座標(世界空間),Normal 為頂點法線(世界空間)、StaticUV 為靜態 lightmap 的紋理座標、DynamicUV 為動態 lightmap 的紋理座標。
void BakedGI(float3 Position, float3 Normal, float2 StaticUV, float2 DynamicUV, out float Out) {
Out = SHADERGRAPH_BAKED_GI(Position, Normal, StaticUV, DynamicUV, false);
}
3)Reflection Probe(反射探針)
Reflection Probe 節點用於獲取反射探針顏色。ViewDire 為頂點的座標(模型空間),Normal 為頂點的法線向量(模型空間)。
void ReflectionProbe(float3 ViewDir, float3 Normal, float LOD, out float3 Out) {
Out = SHADERGRAPH_REFLECTION_PROBE(ViewDir, Normal, LOD);
}
4)Main Light Direction
Main Light Direction 節點用於獲取頂點指向光源的單位方向向量(世界空間)。Shader Graph 13.1.9(2022.1+)版本才開始出現 Main Light Direction 節點。如果使用者的 Shader Graph 版本較低,可以通過 8.2 節中 Custom Function 節點建立自定義函數,獲取燈光方向。
Matrix 中包含 Matrix 2x2、Matrix 3x3、Matrix 4x4、Transformation Matrix 節點。
Transformation Matrix 節點可以獲取到 Model、Inverse Model、View、Inverse View、Projection、Inverse Projection、View Projection、Inverse View Projection 矩陣,實現如下。
// Model, [模型空間->世界空間]的變換矩陣M
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_M;
// InverseModel, [世界空間->模型空間]的變換矩陣I_M
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_M;
// View, [世界空間->觀察空間]的變換矩陣V
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_V;
// InverseView, [觀察空間->世界空間]的變換矩陣I_V
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_V;
// Projection, [觀察空間->裁剪空間]的變換矩陣P
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_P;
// InverseProjection, [裁剪空間->觀察空間]的變換矩陣I_P
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_P;
// ViewProjection, [世界空間->裁剪空間]的變換矩陣VP
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_VP;
// InverseViewProjection, [裁剪空間->世界空間]的變換矩陣I_VP
float4x4 _TransformationMatrix_Out = UNITY_MATRIX_I_VP;
1)Camera(相機引數)
Camera 節點用於獲取相機的以下屬性。
2)Fog(霧效引數)
Fog 節點用於獲取 Color(霧效顏色)和 Density(裁剪空間深度處的霧效強度)。
void Fog(float3 Position, out float4 Color, out float Density) {
SHADERGRAPH_FOG(Position, Color, Density);
}
3)Object(物件引數)
Object 節點用於獲取當前渲染物件在世界空間中的位置縮放。
float3 _Object_Position = SHADERGRAPH_OBJECT_POSITION;
float3 _Object_Scale = float3(
length(float3(UNITY_MATRIX_M[0].x, UNITY_MATRIX_M[1].x, UNITY_MATRIX_M[2].x)),
length(float3(UNITY_MATRIX_M[0].y, UNITY_MATRIX_M[1].y, UNITY_MATRIX_M[2].y)),
length(float3(UNITY_MATRIX_M[0].z, UNITY_MATRIX_M[1].z, UNITY_MATRIX_M[2].z)));
4)Scene Color(場景顏色)
Scene Color 節點用於獲取 UV 處的顏色緩衝區的顏色值,uv 座標可以通過 Screen Position 節點(Default 模式)獲取。
void SceneColor(float4 UV, out float3 Out) {
Out = SHADERGRAPH_SAMPLE_SCENE_COLOR(UV);
}
說明:Scene Color 節點僅支援 URP 和 HDRP 管線,對於 Built-in 管線,節點返回 0;在URP 中,此節點返回 Camera Opaque Texture 的值,此紋理的內容僅適用於透明物件;將主節點的 Surface Type 屬性設定為 Transparent 可以從此節點接收正確的值。
5)Scene Depth(場景深度)
Scene Depth 節點用於獲取 UV 處的深度緩衝區的深度值。
void SceneDepth_Raw(float4 UV, out float Out) {
Out = SHADERGRAPH_SAMPLE_SCENE_DEPTH(UV);
}
6)Screen(螢幕引數)
Screen 節點用於獲取螢幕的寬度和高度引數。
float _Screen_Width = _ScreenParams.x;
float _Screen_Height = _ScreenParams.y;
1)Texture 2D Asset 和 Cubemap Asset
Texture 2D Asset 節點用於匯入 Texture 2D 資源,Cubemap Asset 節點用於匯入 Cubemap 資源。
2)Sample Texture 2D 和 Sample Cubemap
Sample Texture 2D 節點用於對 Texture 2D 進行取樣,Sample Cubemap 節點用於對 Cubemap 進行取樣。
3)Texel Size(Texture 2D 的寬高)
Texel Size 節點用於獲取 Texture 2D 的寬度和高度。
float _TexelSize_Width = Texture_TexelSize.z;
float _TexelSize_Height = Texture_TexelSize.w;
4)Split Texture Transform(Texture 2D 的縮放和偏移)
Split Texture Transform 節點用於 Texture 2D 的 Tiling(縮放)和 Offset(偏移)屬性。
5)Sampler State(取樣器的狀態設定)
Sampler State 節點用於設定取樣器的狀態。Filter 定義了取樣的濾波模式,選項有:Linear、Point、Trilinear;Wrap 定義了取樣的包裹模式,選項有:Repeat、Clamp、Mirror、MirrorOnce。
Math 官方介紹詳見→Math Nodes,其中參照 Shader 中的函數釋義詳見→Shader常數、變數、結構體、函數。
// 加法, Out=A+B
void Add(float4 A, float4 B, out float4 Out)
// 減法, Out=A-B
void Subtract(float4 A, float4 B, out float4 Out)
// 乘法
void Multiply(float4 A, float4 B, out float4 Out) // Out=A*B
void Multiply(float4 A, float4x4 B, out float4 Out) // Out=mul(A,B)
void Multiply(float4x4 A, float4x4 B, out float4x4 Out) // Out=mul(A,B)
// 除法, Out=A/B
void Divide(float4 A, float4 B, out float4 Out)
// 冪運算, Out=pow(A,B)
void Power(float4 A, float4 B, out float4 Out)
// *方根, Out=sqrt(In)
void SquareRoot(float4 In, out float4 Out)
// 絕對值, Out=abs(In)
void Absolute(float4 In, out float4 Out)
// 取反, Out=-1*In
void Negate(float4 In, out float4 Out)
// 倒數
void Reciprocal(float4 In, out float4 Out) // Out=1.0/In
void Reciprocal_Fast(float4 In, out float4 Out) // Out=rcp(In)
// 取餘, Out=fmod(A,B)
void Modulo(float4 A, float4 B, out float4 Out)
// 指數
void Exponential(float4 In, out float4 Out) // Out=exp(In)
void Exponential2(float4 In, out float4 Out) // Out=exp2(In)
// 對數
void Log(float4 In, out float4 Out) // Out=log(In)
void Log2(float4 In, out float4 Out) // Out=log2(In)
void Log10(float4 In, out float4 Out) // Out=log10(In)
// 反*方根
void ReciprocalSquareRoot(float4 In, out float4 Out) // Out=rsqrt(In)
// 模長, Out=length(In)
void Length(float4 In, out float Out)
// 歸一化
void Normalize(float4 In, out float4 Out) // Out=normalize(In)
// 多色調分色顯示, Out=floor(In/(1/Steps))*(1/Steps)
void Posterize(float4 In, float4 Steps, out float4 Out)
// 角度轉弧度, Out=radians(In)
void DegreesToRadians(float4 In, out float4 Out)
// 弧度轉角度, Out=degrees(In)
void RadiansToDegrees(float4 In, out float4 Out)
// 正弦, Out=sin(In)
void Sine(float4 In, out float4 Out)
// 餘弦, Out=cos(In)
void Cosine(float4 In, out float4 Out)
// 正切, Out=tan(In)
void Tangent(float4 In, out float4 Out)
// 反正弦, Out=asin(In)
void Arcsine(float4 In, out float4 Out)
// 反餘弦, Out=acos(In)
void Arccosine(float4 In, out float4 Out)
// 反正切
void Arctangent(float4 In, out float4 Out) // Out=atan(In)
void Arctangent2(float4 A, float4 B, out float4 Out) // Out=atan2(A,B)
// 雙曲正弦, Out=sinh(In)
void HyperbolicSine(float4 In, out float4 Out)
// 雙曲餘弦, Out=cosh(In)
void HyperbolicCosine(float4 In, out float4 Out)
// 雙曲正切, Out=tanh(In)
void HyperbolicTangent(float4 In, out float4 Out)
// 最大值, Out=max(A,B)
void Maximum(float4 A, float4 B, out float4 Out)
// 最小值, Out=min(A,B)
void Minimum(float4 A, float4 B, out float4 Out)
// 限界, Out=clamp(In,Min,Max)
void Clamp(float4 In, float4 Min, float4 Max, out float4 Out)
// 0-1限界, Out=saturate(In)
void Saturate(float4 In, out float4 Out)
// 取小數部分, Out=frac(In)
void Fraction(float4 In, out float4 Out)
// 1減, Out=1-In
void OneMinus(float4 In, out float4 Out)
// 重對映, Out=OutMinMax.x+(In-InMinMax.x)*(OutMinMax.y-OutMinMax.x)/(InMinMax.y-InMinMax.x)
void Remap(float4 In, float2 InMinMax, float2 OutMinMax, out float4 Out)
// 偽亂數生成器
void RandomRange(float2 Seed, float Min, float Max, out float Out) {
float randomno = frac(sin(dot(Seed, float2(12.9898, 78.233)))*43758.5453);
Out = lerp(Min, Max, randomno);
}
// 正負符合, Out=sign(In)
void Sign(float4 In, out float4 Out)
// 取整數部分, Out=trunc(In)
void Truncate(float4 In, out float4 Out)
// 向上取整, Out=ceil(In)
void Ceiling(float4 In, out float4 Out)
// 向下取整, Out=floor(In)
void Floor(float4 In, out float4 Out)
// 四捨五入取整, Out=round(In)
void Round(float4 In, out float4 Out)
// 邊界判斷, Out=step(Edge,In), 即: In>=Edge時, 返回1, 否則返回0
void Step(float4 Edge, float4 In, out float4 Out)
// 插值, Out=lerp(A,B,T), 即: Out=(1-T)*A+T*B
void Lerp(float4 A, float4 B, float4 T, out float4 Out)
// 反插值, Out=(T-A)/(B-A)
void InverseLerp(float4 A, float4 B, float4 T, out float4 Out)
// *滑插值, Out=smoothstep(Edge1,Edge2,In), 即: k=saturate((In-Edge1)/(Edge2-Edge1)), Out=k*k*(3-2*k)
void Smoothstep(float4 Edge1, float4 Edge2, float4 In, out float4 Out)
// 兩點間距離, Out=distance(A,B)
void Distance(float4 A, float4 B, out float Out)
// 向量點乘, Out=dot(A,B)
void DotProduct(float4 A, float4 B, out float Out)
// 向量叉乘, Out=cross(A,B)
void CrossProduct(float3 A, float3 B, out float3 Out)
// 向量投影, Out=B*dot(A,B)/dot(B, B)
void Projection(float4 A, float4 B, out float4 Out)
// 向量反射, Out=reflect(In,Normal), In和Normal不需要歸一化
void Reflection(float4 In, float4 Normal, out float4 Out)
// 菲涅爾效應, Out=pow((1.0-saturate(dot(normalize(Normal),normalize(ViewDir)))),Power)
void FresnelEffect(float3 Normal, float3 ViewDir, float Power, out float Out)
// 繞軸旋轉
void RotateAboutAxis(float3 In, float3 Axis, float Rotation, out float3 Out)
// 球形遮罩, Out =1-saturate((distance(Coords,Center)-Radius)/(1-Hardness)), 即: 球內返回1, 求外返回零
void SphereMask(float4 Coords, float4 Center, float Radius, float Hardness, out float4 Out)
// 座標或向量空間變換, 可以進行Object、World、View、Tangent、Absolute World空間之間變換
void Transform(float4 In, out float4 Out)
// 構建矩陣
void MatrixConstruction(float4 M0, float4 M1, float4 M2, float3 M3, out float4x4 Out4x4, out float3x3 Out3x3, out float2x2 Out2x2)
// 計算矩陣的秩, Out=determinant(In)
void MatrixDeterminant(float4x4 In, out float Out)
// 分離矩陣的行向量或列向量
void MatrixSplit(float4x4 In, out float4 M0, out float4 M1, out float4 M2, out float4 M3)
// 矩陣轉置, Out=transpose(In)
void MatrixTranspose(float4x4 In, out float4x4 Out)
// Out=ddx(In)
void DDX(float4 In, out float4 Out)
// Out=ddxy(In)
void DDXY(float4 In, out float4 Out)
// Out=ddy(In)
void DDY(float4 In, out float4 Out)
// 鋸齒波, Out=2*(In-floor(0.5 + In))
void SawtoothWave(float4 In, out float4 Out)
// 方波, Out=1.0-2.0*round(frac(In))
void SquareWave(float4 In, out float4 Out)
// 三角波, Out=2.0*abs(2*(In-floor(0.5+In)))-1.0
void TriangleWave(float4 In, out float4 Out)
// 帶噪聲的正弦波
void NoiseSineWave(float4 In, float2 MinMax, out float4 Out) {
float sinIn = sin(In);
float sinInOffset = sin(In + 1.0);
float randomno = frac(sin((sinIn - sinInOffset) * (12.9898 + 78.233))*43758.5453);
float noise = lerp(MinMax.x, MinMax.y, randomno);
Out = sinIn + noise;
}
Procedural 官方介紹詳見→Procedural Nodes。
Checkerboard 節點用於用於繪製棋盤紋理,實現見→Checkerboard Node。
Noise 下面有 Gradient Noise(梯度噪聲)、Simple Noise(簡單噪聲)、Voronoi(泰森多邊形)。噪聲紋理應用:選中物體消融特效、消融特效、流動霧效。
Shapes 下面有 Ellipse(橢圓)、Polygon(多邊形)、Rectangle(矩形)、Rounded Polygon(圓角多邊形)、Rounded Rectangle(圓角矩形)。
UV 官方介紹詳見→UV Nodes。
1)Flipbook(翻書 uv 變換)
Flipbook 節點用於做翻書動畫,實現見→Flipbook Node,Width 和 Height 分別為水*和垂直區塊的數量,Tile 為當前區塊索引。
2)Polar Coordinates(極座標 uv 變換)
Polar Coordinates 節點用於將直角座標系下的 uv 座標轉換為極座標系下的座標,實現見→Polar Coordinates。
3)Radial Shear(徑向剪下 uv 變換)
Radial Shear 節點用於模擬波的徑向剪下變形效果,實現見→Radial Shear Node。
4)Rotate(旋轉 uv 變換)
Rotate 節點用於實現紋理旋轉效果,實現見→Rotate Node。
5)Spherize(球形變形 uv 變換)
Spherize 節點用於模擬魚眼鏡頭的球形變形效果,實現見→Spherize。
6)Tiling And Offset(縮放和偏移 uv 變換)
Tiling And Offset 節點用於縮放和偏移 uv 座標。
void TilingAndOffset(float2 UV, float2 Tiling, float2 Offset, out float2 Out) {
Out = UV * Tiling + Offset;
}
7)Twirl(螺旋線 uv 變換)
Twirl 節點用於對 uv 座標進行螺旋線變換,實現見→Twirl Node。
Utility 官方介紹詳見→Utility Nodes。
// 與運算, Out=A&&B
void And(float A, float B, out float Out)
// 或運算, Out=A||B
void Or(float In, out float Out)
// 非運算, Out=!In
void Not(float In, out float Out)
// 全true, Out=all(In), 即: 如果In中每個分量都不為零則返回1, 否則返回0
void All(float4 In, out float Out)
// 存在一true, Out=any(In), 即: 如果In中存在一個分量不為零則返回1, 否則返回0
void Any(float4 In, out float Out)
// 全非判斷, Out=!A&&!B
void Nand(float A, float B, out float Out)
// 無窮數判斷, Out = isinf(In)
void IsInfinite(float In, out float Out)
// 未知數判斷, Out=(In<0.0||In>0.0||In==0.0)?0:1
void IsNan(float In, out float Out)
// 分支, Out=Predicate?True:False
void Branch(float Predicate, float4 True, float4 False, out float4 Out)
// 比較A和B的大小, 運運算元可以選擇: Equal、Not Equal、Less、Less Or Equal、Greater、Greater Or Equal
void Comparison(float A, float B, out float Out)
// 如果當前渲染正面則返回1,如果渲染背面則返回0
void IsFrontFaceNode(out float Out)
自定義函數節點允許使用者通過指令碼自定義節點的運算邏輯,官方介紹見→Custom Function Node。
4.4 4)節提過,Shader Graph 13.1.9(2022.1+)版本才開始出現 Main Light Direction 節點,如果使用者想在低版本的 Shader Graph 中獲取燈光方向,可以通過 Custom Function 實現。下面將通過 Custom Function 實現 Main Light Direction 節點的功能。Shader Graph簡介 中基於自定義的 Main Light 實現了漫反射光照效果。
建立 Custom Function 節點,選中後,在 Node Settings 中設定如下,SHADERGRAPH_PREVIEW 用來判斷是否是預覽視窗。
#if SHADERGRAPH_PREVIEW
Direction = half3(0.5, 0.5, 0);
Color = half4(1, 0, 0, 1);
#else
Light light = GetMainLight();
Direction = light.direction;
Color = light.color;
#endif
宣告:本文轉自【Unity3D】Shader Graph節點。