法線ベクトルの可視化
この例の Unity シェーダーは、メッシュ上に法線ベクトル値を可視化します。
URP の基本的な Unlit シェーダー セクションの Unity シェーダーソースファイルを使用し、ShaderLab コードに以下の変更を加えます。
この例の頂点シェーダー用の入力構造体である
struct Attributes
で、各頂点の法線ベクトルが含まれる変数を宣言します。struct Attributes { float4 positionOS : POSITION; // 各頂点の法線ベクトルが含まれる変数の宣言。 half3 normal : NORMAL; };
この例のフラグメントシェーダー用の入力構造体である
struct Varyings
で、各フラグメントの法線ベクトル値を格納するための変数を宣言します。struct Varyings { float4 positionHCS : SV_POSITION; // 法線ベクトル値を格納するための変数。 half3 normal : TEXCOORD0; };
この例では、法線ベクトルの 3 つの成分を各フラグメントの RGB カラー値として使用します。
メッシュ上に法線ベクトル値をレンダリングするため、以下のコードをフラグメントシェーダーとして使用します。
half4 frag(Varyings IN) : SV_Target { half4 color = 0; color.rgb = IN.normal; return color; }
Unity によってメッシュ上に法線ベクトル値がレンダリングされます。
カプセルの一部が黒色になっています。これは、それらの点における法線ベクトルの 3 つの成分すべてが負だからです。次のステップでは、そうした領域の値もレンダリングする方法を示します。
負の法線ベクトル成分をレンダリングするには、圧縮手法を使用します。法線成分値の範囲
(-1..1)
を色値の範囲(0..1)
に圧縮するには、以下の行をcolor.rgb = IN.normal;
以下の行に変更します。
color.rgb = IN.normal * 0.5 + 0.5;
これで Unity によってメッシュ上に法線ベクトル値が色としてレンダリングされます。
以下は、この例の完成した ShaderLab コードです。
// このシェーダーはメッシュ上に法線ベクトル値を可視化します。
Shader "Example/URPUnlitShaderNormal"
{
Properties
{ }
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
// 各頂点の法線ベクトルが含まれる変数の
// 宣言。
half3 normal : NORMAL;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
half3 normal : TEXCOORD0;
};
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
// TransformObjectToWorldNormal 関数を使用して法線をオブジェクトから
// ワールド空間に変換します。この関数は Core.hlsl. 内で参照されている
// SpaceTransforms.hlsl ファイルの関数です。
OUT.normal = TransformObjectToWorldNormal(IN.normal);
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
half4 color = 0;
// IN.normal は 3D ベクトルです。各ベクトル成分の範囲は
// -1..1 です。負の値を含むすべてのベクトル要素を色として
// 表示するため、それぞれの値を 0..1 の範囲に圧縮します。
color.rgb = IN.normal * 0.5 + 0.5;
return color;
}
ENDHLSL
}
}
}