ビルトインのUniversal Render Pipelineシェーダをまとめてみた
URPシェーダーの概要
公式ドキュメントを参照
2D/Sprite-Lit-Default
インスペクター以下である
ちなみにMaskに関してはテクスチャを設定しても変化が見られず。。。
なので、DiffuseとNormalMapについて述べる
ソースコードは以下である
Shader "Universal Render Pipeline/2D/Sprite-Lit-Default"
{
Properties
{
_MainTex("Diffuse", 2D) = "white" {}
_MaskTex("Mask", 2D) = "white" {}
_NormalMap("Normal Map", 2D) = "bump" {}
// Legacy properties. They're here so that materials using this shader can gracefully fallback to the legacy sprite shader.
[HideInInspector] _Color("Tint", Color) = (1,1,1,1)
[HideInInspector] _RendererColor("RendererColor", Color) = (1,1,1,1)
[HideInInspector] _Flip("Flip", Vector) = (1,1,1,1)
[HideInInspector] _AlphaTex("External Alpha", 2D) = "white" {}
[HideInInspector] _EnableExternalAlpha("Enable External Alpha", Float) = 0
}
HLSLINCLUDE
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
ENDHLSL
SubShader
{
Tags {"Queue" = "Transparent" "RenderType" = "Transparent" "RenderPipeline" = "UniversalPipeline" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
ZWrite Off
Pass
{
Tags { "LightMode" = "Universal2D" }
HLSLPROGRAM
#pragma vertex CombinedShapeLightVertex
#pragma fragment CombinedShapeLightFragment
#pragma multi_compile USE_SHAPE_LIGHT_TYPE_0 __
#pragma multi_compile USE_SHAPE_LIGHT_TYPE_1 __
#pragma multi_compile USE_SHAPE_LIGHT_TYPE_2 __
#pragma multi_compile USE_SHAPE_LIGHT_TYPE_3 __
struct Attributes
{
float3 positionOS : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
half4 color : COLOR;
float2 uv : TEXCOORD0;
half2 lightingUV : TEXCOORD1;
UNITY_VERTEX_OUTPUT_STEREO
};
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/LightingUtility.hlsl"
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
TEXTURE2D(_MaskTex);
SAMPLER(sampler_MaskTex);
TEXTURE2D(_NormalMap);
SAMPLER(sampler_NormalMap);
half4 _MainTex_ST;
half4 _NormalMap_ST;
#if USE_SHAPE_LIGHT_TYPE_0
SHAPE_LIGHT(0)
#endif
#if USE_SHAPE_LIGHT_TYPE_1
SHAPE_LIGHT(1)
#endif
#if USE_SHAPE_LIGHT_TYPE_2
SHAPE_LIGHT(2)
#endif
#if USE_SHAPE_LIGHT_TYPE_3
SHAPE_LIGHT(3)
#endif
Varyings CombinedShapeLightVertex(Attributes v)
{
Varyings o = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.positionCS = TransformObjectToHClip(v.positionOS);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
float4 clipVertex = o.positionCS / o.positionCS.w;
o.lightingUV = ComputeScreenPos(clipVertex).xy;
o.color = v.color;
return o;
}
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/CombinedShapeLightShared.hlsl"
half4 CombinedShapeLightFragment(Varyings i) : SV_Target
{
half4 main = i.color * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
half4 mask = SAMPLE_TEXTURE2D(_MaskTex, sampler_MaskTex, i.uv);
return CombinedShapeLightShared(main, mask, i.lightingUV);
}
ENDHLSL
}
Pass
{
Tags { "LightMode" = "NormalsRendering"}
HLSLPROGRAM
#pragma vertex NormalsRenderingVertex
#pragma fragment NormalsRenderingFragment
struct Attributes
{
float3 positionOS : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
float4 tangent : TANGENT;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
half4 color : COLOR;
float2 uv : TEXCOORD0;
half3 normalWS : TEXCOORD1;
half3 tangentWS : TEXCOORD2;
half3 bitangentWS : TEXCOORD3;
UNITY_VERTEX_OUTPUT_STEREO
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
TEXTURE2D(_NormalMap);
SAMPLER(sampler_NormalMap);
half4 _NormalMap_ST; // Is this the right way to do this?
Varyings NormalsRenderingVertex(Attributes attributes)
{
Varyings o = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(attributes);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.positionCS = TransformObjectToHClip(attributes.positionOS);
o.uv = TRANSFORM_TEX(attributes.uv, _NormalMap);
o.uv = attributes.uv;
o.color = attributes.color;
o.normalWS = TransformObjectToWorldDir(float3(0, 0, -1));
o.tangentWS = TransformObjectToWorldDir(attributes.tangent.xyz);
o.bitangentWS = cross(o.normalWS, o.tangentWS) * attributes.tangent.w;
return o;
}
#include "Packages/com.unity.render-pipelines.universal/Shaders/2D/Include/NormalsRenderingShared.hlsl"
half4 NormalsRenderingFragment(Varyings i) : SV_Target
{
half4 mainTex = i.color * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
half3 normalTS = UnpackNormal(SAMPLE_TEXTURE2D(_NormalMap, sampler_NormalMap, i.uv));
return NormalsRenderingShared(mainTex, normalTS, i.tangentWS.xyz, i.bitangentWS.xyz, i.normalWS.xyz);
}
ENDHLSL
}
Pass
{
Tags { "LightMode" = "UniversalForward" "Queue"="Transparent" "RenderType"="Transparent"}
HLSLPROGRAM
#pragma vertex UnlitVertex
#pragma fragment UnlitFragment
struct Attributes
{
float3 positionOS : POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float4 color : COLOR;
float2 uv : TEXCOORD0;
UNITY_VERTEX_OUTPUT_STEREO
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
float4 _MainTex_ST;
Varyings UnlitVertex(Attributes attributes)
{
Varyings o = (Varyings)0;
UNITY_SETUP_INSTANCE_ID(attributes);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
o.positionCS = TransformObjectToHClip(attributes.positionOS);
o.uv = TRANSFORM_TEX(attributes.uv, _MainTex);
o.uv = attributes.uv;
o.color = attributes.color;
return o;
}
float4 UnlitFragment(Varyings i) : SV_Target
{
float4 mainTex = i.color * SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
return mainTex;
}
ENDHLSL
}
}
Fallback "Sprites/Default"
}
当シェーダ使用するには色々準備する必要がある。
RenderListに2D Rendererアタッチ
2DLigthのGlobalLigth以外を配置し、Use Normal Mapにチェック。
上記の手順を行った結果
Autodesk Interactive系
公式ドキュメントによると、3DsMaxやMaya上でPBRマテリアル使用して作成したFBXをインポートした際にUnity側が自動でデフォルトシェーダとして適用する
ゲーム開発だと、シェーダ自体はゲームエンジン内で作成したのを適用することが多いので、
今回こちらは割愛
SpeedTree系
SpeedTreeとは、木を手軽に作成できるツールである。(https://unity.com/ja/products/speedtree)
自分がメモしたゲームグラフィックス・CGWORLDの内容見ると、エースコンバット7などで使用されているらしい。(確かもっと色んな作品採用されてたはずだが、重要そうではなかったため記載しなかったのかも?)。
特に使用しなさそうなので割愛
一応URPのおけるSpeedTreeの特徴を公式ドキュメントからそのまま抜粋
Universal Render Pipeline (ユニバーサルレンダーパイプライン、URP) は、樹木のシェーダーとして SpeedTree システムを使用します。詳細については、Unity のメインマニュアルにある SpeedTree のドキュメントを参照してください。
URP で SpeedTree シェーダーを使用するときは、以下の点に留意してください。
・URP では樹木にグローバルイルミネーションを適用できません。
・URP では樹木に影を投影できません。
・URP では、ライトを頂点単位にするかピクセル単位にするかを URP アセット で設定できます。
Particles/Lit
PBRに対応したパーティクルで、リアルなエフェクトを表現できるが負荷がSimple Litや
Unlitと比べると高いのが特徴
さらに詳しい内容は公式ドキュメントを参照
以下がインスペクターである
以下がソースコードである
// No shadows
Shader "Universal Render Pipeline/Particles/Lit"
{
Properties
{
[MainTexture] _BaseMap("Base Map", 2D) = "white" {}
[MainColor] _BaseColor("Base Color", Color) = (1,1,1,1)
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
_MetallicGlossMap("Metallic Map", 2D) = "white" {}
[Gamma] _Metallic("Metallic", Range(0.0, 1.0)) = 0.0
_Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
_BumpScale("Scale", Float) = 1.0
_BumpMap("Normal Map", 2D) = "bump" {}
[HDR] _EmissionColor("Color", Color) = (0,0,0)
_EmissionMap("Emission", 2D) = "white" {}
_ReceiveShadows("Receive Shadows", Float) = 1.0
// -------------------------------------
// Particle specific
_SoftParticlesNearFadeDistance("Soft Particles Near Fade", Float) = 0.0
_SoftParticlesFarFadeDistance("Soft Particles Far Fade", Float) = 1.0
_CameraNearFadeDistance("Camera Near Fade", Float) = 1.0
_CameraFarFadeDistance("Camera Far Fade", Float) = 2.0
_DistortionBlend("Distortion Blend", Float) = 0.5
_DistortionStrength("Distortion Strength", Float) = 1.0
// -------------------------------------
// Hidden properties - Generic
[HideInInspector] _Surface("__surface", Float) = 0.0
[HideInInspector] _Blend("__mode", Float) = 0.0
[HideInInspector] _AlphaClip("__clip", Float) = 0.0
[HideInInspector] _BlendOp("__blendop", Float) = 0.0
[HideInInspector] _SrcBlend("__src", Float) = 1.0
[HideInInspector] _DstBlend("__dst", Float) = 0.0
[HideInInspector] _ZWrite("__zw", Float) = 1.0
[HideInInspector] _Cull("__cull", Float) = 2.0
// Particle specific
[HideInInspector] _ColorMode("_ColorMode", Float) = 0.0
[HideInInspector] _BaseColorAddSubDiff("_ColorMode", Vector) = (0,0,0,0)
[ToggleOff] _FlipbookBlending("__flipbookblending", Float) = 0.0
[HideInInspector] _SoftParticlesEnabled("__softparticlesenabled", Float) = 0.0
[HideInInspector] _CameraFadingEnabled("__camerafadingenabled", Float) = 0.0
[HideInInspector] _SoftParticleFadeParams("__softparticlefadeparams", Vector) = (0,0,0,0)
[HideInInspector] _CameraFadeParams("__camerafadeparams", Vector) = (0,0,0,0)
[HideInInspector] _DistortionEnabled("__distortionenabled", Float) = 0.0
[HideInInspector] _DistortionStrengthScaled("Distortion Strength Scaled", Float) = 0.1
// Editmode props
[HideInInspector] _QueueOffset("Queue offset", Float) = 0.0
// ObsoleteProperties
[HideInInspector] _FlipbookMode("flipbook", Float) = 0
[HideInInspector] _Glossiness("gloss", Float) = 0
[HideInInspector] _Mode("mode", Float) = 0
[HideInInspector] _Color("color", Color) = (1,1,1,1)
}
SubShader
{
Tags{"RenderType" = "Opaque" "IgnoreProjector" = "True" "PreviewType" = "Plane" "PerformanceChecks" = "False" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit"}
// ------------------------------------------------------------------
// Forward pass.
Pass
{
// Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
// no LightMode tag are also rendered by Universal Render Pipeline
Name "ForwardLit"
Tags {"LightMode" = "UniversalForward"}
BlendOp[_BlendOp]
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma target 2.0
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local _RECEIVE_SHADOWS_OFF
// -------------------------------------
// Particle Keywords
#pragma shader_feature_local_fragment _ _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ _COLOROVERLAY_ON _COLORCOLOR_ON _COLORADDSUBDIFF_ON
#pragma shader_feature_local _FLIPBOOKBLENDING_ON
#pragma shader_feature_local _SOFTPARTICLES_ON
#pragma shader_feature_local _FADING_ON
#pragma shader_feature_local _DISTORTION_ON
// -------------------------------------
// Universal Pipeline keywords
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile_fragment _ _SHADOWS_SOFT
// -------------------------------------
// Unity defined keywords
#pragma multi_compile_fog
#pragma multi_compile_instancing
#pragma instancing_options procedural:ParticleInstancingSetup
#pragma vertex ParticlesLitVertex
#pragma fragment ParticlesLitFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitForwardPass.hlsl"
ENDHLSL
}
// ------------------------------------------------------------------
// GBuffer pass.
Pass
{
// Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
// no LightMode tag are also rendered by Universal Render Pipeline
Name "GBuffer"
Tags{"LightMode" = "UniversalGBuffer"}
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles
#pragma target 2.0
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local _RECEIVE_SHADOWS_OFF
// -------------------------------------
// Particle Keywords
//#pragma shader_feature _ _ALPHAPREMULTIPLY_ON _ALPHAMODULATE_ON
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ _COLOROVERLAY_ON _COLORCOLOR_ON _COLORADDSUBDIFF_ON
#pragma shader_feature_local _FLIPBOOKBLENDING_ON
//#pragma shader_feature _SOFTPARTICLES_ON
//#pragma shader_feature _FADING_ON
//#pragma shader_feature _DISTORTION_ON
// -------------------------------------
// Universal Pipeline keywords
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
//#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
//#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile _ _SHADOWS_SOFT
#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT
// -------------------------------------
// Unity defined keywords
#pragma multi_compile_instancing
#pragma instancing_options procedural:ParticleInstancingSetup
#pragma vertex ParticlesGBufferVertex
#pragma fragment ParticlesGBufferFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitGbufferPass.hlsl"
ENDHLSL
}
// ------------------------------------------------------------------
// Scene view outline pass.
Pass
{
Name "SceneSelectionPass"
Tags { "LightMode" = "SceneSelectionPass" }
BlendOp Add
Blend One Zero
ZWrite On
Cull Off
HLSLPROGRAM
#define PARTICLES_EDITOR_META_PASS
#pragma target 2.0
// -------------------------------------
// Particle Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local _FLIPBOOKBLENDING_ON
// -------------------------------------
// Unity defined keywords
#pragma multi_compile_instancing
#pragma instancing_options procedural:ParticleInstancingSetup
#pragma vertex vertParticleEditor
#pragma fragment fragParticleSceneHighlight
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesEditorPass.hlsl"
ENDHLSL
}
// ------------------------------------------------------------------
// Scene picking buffer pass.
Pass
{
Name "ScenePickingPass"
Tags{ "LightMode" = "Picking" }
BlendOp Add
Blend One Zero
ZWrite On
Cull Off
HLSLPROGRAM
#define PARTICLES_EDITOR_META_PASS
#pragma target 2.0
// -------------------------------------
// Particle Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local _FLIPBOOKBLENDING_ON
// -------------------------------------
// Unity defined keywords
#pragma multi_compile_instancing
#pragma instancing_options procedural:ParticleInstancingSetup
#pragma vertex vertParticleEditor
#pragma fragment fragParticleScenePicking
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesLitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Particles/ParticlesEditorPass.hlsl"
ENDHLSL
}
Pass
{
Name "Universal2D"
Tags{ "LightMode" = "Universal2D" }
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#include "Packages/com.unity.render-pipelines.universal/Shaders/UnlitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"
ENDHLSL
}
}
Fallback "Universal Render Pipeline/Particles/Simple Lit"
CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.ParticlesLitShader"
}
Surface Type
半透明で描画するのか、不透明で描画するのか選べる
Blend方法は、
半透明だと、BlendModeによって変化する
不透明だと、常にOne Zero
描画順は、
半透明は不透明の後、不透明は半透明の前に描画される
下記画像でエフェクトを発生させてみる
Opaque
Transparent
Blending Mode
Blendする方法を選択できる
※SrcColor :今現在 Fragment シェーダが算出して書き込もうとしている色。xとする
※DstColor :既に描画先に書き込まれている色。yとする
Blend Mode | 意味 | 計算式 |
---|---|---|
Alpha | SrcAlpha OneMinusSrcAlpha | SrcColor.a * x + (1- SrcColor.a) * y |
Premultiply | One OneMinusSrcAlpha | 1 * x + (1- SrcColor.a) * y |
Additive | SrcAlpha One | SrcColor.a * x + 1 * y |
Multiply | DstColor Zero | y * x + 0 * y |
各々用途は、公式ドキュメントから抜粋
Alpha を選択した場合は、マテリアルのアルファ値を使用してサーフェスの透明度を変更します。0 は完全に透明になります。1 は完全に不透明になりますが、マテリアルは透明なレンダーパス中は引き続きレンダリングされます。これは、雲のように完全に表示されつつも時間とともにフェードするビジュアルに便利です。
Premultiply を選択すると、マテリアルに Alpha と似たようなエフェクトが適用されますが、サーフェスが透明な場合もリフレクションやハイライトが維持されます。これは反射した光のみが表示されることを意味します。例えば、透明なガラスを想像してください。
Additive を選択すると、マテリアルの別のサーフェスの上に追加のレイヤーが重ねられます。これはホログラムに適しています。
Multiply を選択すると、マテリアルの色とサーフェスの背後の色が乗算されます。これには画像を暗くする効果があり、色付きのガラスを通したように見えます。
Render Face
Cullingの設定
Render Face | 意味 |
---|---|
Front Face | ポリゴンの表側を描画 |
Back Face | ポリゴンの裏面描画 |
Both | ポリゴンの両方描画 |
Alpha Clipping
Alpha Clippingより小さいアルファ値は描画されない
Alpha Clippingが0
Alpha Clippingが0.012
Receive Shadow
パーティクルに影を落とす
Receive Shadowオン
Receive Shadowオフ
Color Mode
パーティクルとマテリアルの色をどのようにブレンドするかを決定する
マテリアルの色で下記のテクスチャを使用し、パーティクルのカラーは赤色にして実験
Multiply
2つの色が乗算され、最終的な色は暗くなる。
Additive
2つの色が加算され、最終的な色は明るくなる。
Subtractive
マテリアルの色からパーティクルの色を減算。
これにより、明度が低くなり、ピクセル自体に全体的に暗いエフェクトが作成される。
Overlay
マテリアルの色が、0.5より小さいときパーティクルのカラーと乗算。つまり暗くなる
マテリアルの色が、0.5より大きいときパーティクルのカラーとスクリーンでブレンド
(スクリーンは、黒は透過、白は白、それ以外は明るくなるというものだが、マテリアルの色が0.5以上なので白または明るくなるという認識で良い)
マテリアルの色で下記のテクスチャを使用
パーティクルのカラーを黒にした
パーティクルのカラーを白にした状態
Color
マテリアルの色を明度で色分けし、それをパーティクルのカラーで乗算する
モノクロに色をつける場合に適している
パーティクルのカラー 白
パーティクルの赤
Difference
マテリアルカラーとパーティクルカラーの差の絶対値
互いに似ているパーティクルカラーとマテリアルカラーをブレンドするのに適している。
Base Map
ベースマップを設定。横のカラーピッガーと乗算する
Metalic Map
メタルネスマップを設定。
金属度と表面の滑らかさ(Smoothness)をスライダーで用いて調整可能
今回はメタルネスマップを使用せずにスライダーで検証してみる
メタルネスマップ横のスライダー0
Smoothness 0.388
メタルネスマップ横のスライダー1
Smoothness 0.388
メタルネスマップ横のスライダー1
Smoothness 1
Normal Map
ノーマルマップを設定
Emmsion Map
エミッションマップを設定。横のカラーピッガーと乗算する
今回はエミッションマップを使用せずにスライダーで検証してみる
Flip-Book Blending
こちらを見た方が速い公式ドキュメントによると
パフォーマンスの問題が生じた場合は、これをオフにしてみてください。
と記載されているので負荷が高いのかも?
Vertex Streams
このマテリアルが正しく機能するために必要な頂点情報が表示される
Sorting Priority
マテリアルごとの描画順を決定する
こちらの値が小さいと先にレンダリングする
その結果、オーバドローを減らすことができる
Soft Particles
ソフトパーティクルを適用できる
ソフトパーティクルとは、エフェクトが他のオブジェクトをヒットチェックした場合に貫通しないようエフェクトのアルファ値をフェイドアウトさせて描画する方法である
NearとFarでフェードアウトの調整可能
Sorting Priorityオフ
Sorting Priorityオン
Camera Fading
カメラからの距離によって、エフェクトのアルファ値をフェイドアウトできる
NearとFarでフェードアウトの調整可能
Enable Distortion
エフェクトを発生させる前の描画結果を歪ませることができる
パーティクルなし
Enable Distortioオン
分かりづらいが歪んでいるのが分かる
Enable Distortioオフ
Particles/Simple Lit
性能の低いデバイスをターゲットにする場合や、よりシンプルなシェーディングを使用する場合は、PBR ではない Simple Lit シェーダー を使用すべき。
さらに詳しい内容は公式ドキュメントを参照
インスペクターはParticles/Litとほぼ同じであるため割愛
Particles/Unlit
このシェーダーはライティングが不要なパーティクルに使用する。
時間のかかるライティングの計算や検索が発生しないため、このシェーダーはローエンドのハードウェアに最適である。
インスペクターはParticles/Litとほぼ同じであるため割愛
Particles/Lit、Particles/Simple Lit、Particles/Unlitの見た目の違い
ワープエフェクトで見た目の違いを見てみる
Unlitは横のポイントライトの影響を一切受けていない
LitとSimple Litは、間接光受けた影響かもしれないがLitの方が写実的ぽっさはある
ただ、Unlitの方がワープエフェクトっぽさはあるのでそこは使いどころ
Particles/Lit
Particles/Simple Lit
Particles/Unlit
Terrain/Lit
Terrainは使用する機会がなさそうなので割愛
Lit
Lit シェーダーを使用すると、石、木、ガラス、プラスチック、金属など、現実世界に存在する物の表面をフォトリアルなレンダリングできる。
光量や反射は実物のように見え、明るい日差しや暗い洞窟など、さまざまなライティング条件に対して適切に反応する。
このシェーダーは、URPで最も演算負荷が高いシェーディングモデルを使用する。
以下がインスペクターである
Shader "Universal Render Pipeline/Lit"
{
Properties
{
// Specular vs Metallic workflow
[HideInInspector] _WorkflowMode("WorkflowMode", Float) = 1.0
[MainTexture] _BaseMap("Albedo", 2D) = "white" {}
[MainColor] _BaseColor("Color", Color) = (1,1,1,1)
_Cutoff("Alpha Cutoff", Range(0.0, 1.0)) = 0.5
_Smoothness("Smoothness", Range(0.0, 1.0)) = 0.5
_GlossMapScale("Smoothness Scale", Range(0.0, 1.0)) = 1.0
_SmoothnessTextureChannel("Smoothness texture channel", Float) = 0
_Metallic("Metallic", Range(0.0, 1.0)) = 0.0
_MetallicGlossMap("Metallic", 2D) = "white" {}
_SpecColor("Specular", Color) = (0.2, 0.2, 0.2)
_SpecGlossMap("Specular", 2D) = "white" {}
[ToggleOff] _SpecularHighlights("Specular Highlights", Float) = 1.0
[ToggleOff] _EnvironmentReflections("Environment Reflections", Float) = 1.0
_BumpScale("Scale", Float) = 1.0
_BumpMap("Normal Map", 2D) = "bump" {}
_Parallax("Scale", Range(0.005, 0.08)) = 0.005
_ParallaxMap("Height Map", 2D) = "black" {}
_OcclusionStrength("Strength", Range(0.0, 1.0)) = 1.0
_OcclusionMap("Occlusion", 2D) = "white" {}
[HDR] _EmissionColor("Color", Color) = (0,0,0)
_EmissionMap("Emission", 2D) = "white" {}
_DetailMask("Detail Mask", 2D) = "white" {}
_DetailAlbedoMapScale("Scale", Range(0.0, 2.0)) = 1.0
_DetailAlbedoMap("Detail Albedo x2", 2D) = "linearGrey" {}
_DetailNormalMapScale("Scale", Range(0.0, 2.0)) = 1.0
[Normal] _DetailNormalMap("Normal Map", 2D) = "bump" {}
// SRP batching compatibility for Clear Coat (Not used in Lit)
[HideInInspector] _ClearCoatMask("_ClearCoatMask", Float) = 0.0
[HideInInspector] _ClearCoatSmoothness("_ClearCoatSmoothness", Float) = 0.0
// Blending state
[HideInInspector] _Surface("__surface", Float) = 0.0
[HideInInspector] _Blend("__blend", Float) = 0.0
[HideInInspector] _AlphaClip("__clip", Float) = 0.0
[HideInInspector] _SrcBlend("__src", Float) = 1.0
[HideInInspector] _DstBlend("__dst", Float) = 0.0
[HideInInspector] _ZWrite("__zw", Float) = 1.0
[HideInInspector] _Cull("__cull", Float) = 2.0
_ReceiveShadows("Receive Shadows", Float) = 1.0
// Editmode props
[HideInInspector] _QueueOffset("Queue offset", Float) = 0.0
// ObsoleteProperties
[HideInInspector] _MainTex("BaseMap", 2D) = "white" {}
[HideInInspector] _Color("Base Color", Color) = (1, 1, 1, 1)
[HideInInspector] _GlossMapScale("Smoothness", Float) = 0.0
[HideInInspector] _Glossiness("Smoothness", Float) = 0.0
[HideInInspector] _GlossyReflections("EnvironmentReflections", Float) = 0.0
[HideInInspector][NoScaleOffset]unity_Lightmaps("unity_Lightmaps", 2DArray) = "" {}
[HideInInspector][NoScaleOffset]unity_LightmapsInd("unity_LightmapsInd", 2DArray) = "" {}
[HideInInspector][NoScaleOffset]unity_ShadowMasks("unity_ShadowMasks", 2DArray) = "" {}
}
SubShader
{
// Universal Pipeline tag is required. If Universal render pipeline is not set in the graphics settings
// this Subshader will fail. One can add a subshader below or fallback to Standard built-in to make this
// material work with both Universal Render Pipeline and Builtin Unity Pipeline
Tags{"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit" "IgnoreProjector" = "True" "ShaderModel"="4.5"}
LOD 300
// ------------------------------------------------------------------
// Forward pass. Shades all light in a single pass. GI + emission + Fog
Pass
{
// Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
// no LightMode tag are also rendered by Universal Render Pipeline
Name "ForwardLit"
Tags{"LightMode" = "UniversalForward"}
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _OCCLUSIONMAP
#pragma shader_feature_local _PARALLAXMAP
#pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
#pragma shader_feature_local_fragment _SPECULAR_SETUP
#pragma shader_feature_local _RECEIVE_SHADOWS_OFF
// -------------------------------------
// Universal Pipeline keywords
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile_fragment _ _SHADOWS_SOFT
#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION
#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
#pragma multi_compile _ SHADOWS_SHADOWMASK
// -------------------------------------
// Unity defined keywords
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fog
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma vertex LitPassVertex
#pragma fragment LitPassFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl"
ENDHLSL
}
Pass
{
Name "ShadowCaster"
Tags{"LightMode" = "ShadowCaster"}
ZWrite On
ZTest LEqual
ColorMask 0
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
// -------------------------------------
// Material Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma vertex ShadowPassVertex
#pragma fragment ShadowPassFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
ENDHLSL
}
Pass
{
// Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
// no LightMode tag are also rendered by Universal Render Pipeline
Name "GBuffer"
Tags{"LightMode" = "UniversalGBuffer"}
ZWrite[_ZWrite]
ZTest LEqual
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
//#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _OCCLUSIONMAP
#pragma shader_feature_local _PARALLAXMAP
#pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
#pragma shader_feature_local_fragment _SPECULAR_SETUP
#pragma shader_feature_local _RECEIVE_SHADOWS_OFF
// -------------------------------------
// Universal Pipeline keywords
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
//#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
//#pragma multi_compile _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile _ _SHADOWS_SOFT
#pragma multi_compile _ _MIXED_LIGHTING_SUBTRACTIVE
// -------------------------------------
// Unity defined keywords
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fragment _ _GBUFFER_NORMALS_OCT
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#pragma vertex LitGBufferPassVertex
#pragma fragment LitGBufferPassFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitGBufferPass.hlsl"
ENDHLSL
}
Pass
{
Name "DepthOnly"
Tags{"LightMode" = "DepthOnly"}
ZWrite On
ColorMask 0
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
#pragma vertex DepthOnlyVertex
#pragma fragment DepthOnlyFragment
// -------------------------------------
// Material Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
ENDHLSL
}
// This pass is used when drawing to a _CameraNormalsTexture texture
Pass
{
Name "DepthNormals"
Tags{"LightMode" = "DepthNormals"}
ZWrite On
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
#pragma vertex DepthNormalsVertex
#pragma fragment DepthNormalsFragment
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma multi_compile _ DOTS_INSTANCING_ON
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthNormalsPass.hlsl"
ENDHLSL
}
// This pass it not used during regular rendering, only for lightmap baking.
Pass
{
Name "Meta"
Tags{"LightMode" = "Meta"}
Cull Off
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
#pragma vertex UniversalVertexMeta
#pragma fragment UniversalFragmentMeta
#pragma shader_feature_local_fragment _SPECULAR_SETUP
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
#pragma shader_feature_local_fragment _SPECGLOSSMAP
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitMetaPass.hlsl"
ENDHLSL
}
Pass
{
Name "Universal2D"
Tags{ "LightMode" = "Universal2D" }
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma exclude_renderers gles gles3 glcore
#pragma target 4.5
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"
ENDHLSL
}
}
SubShader
{
// Universal Pipeline tag is required. If Universal render pipeline is not set in the graphics settings
// this Subshader will fail. One can add a subshader below or fallback to Standard built-in to make this
// material work with both Universal Render Pipeline and Builtin Unity Pipeline
Tags{"RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" "UniversalMaterialType" = "Lit" "IgnoreProjector" = "True" "ShaderModel"="2.0"}
LOD 300
// ------------------------------------------------------------------
// Forward pass. Shades all light in a single pass. GI + emission + Fog
Pass
{
// Lightmode matches the ShaderPassName set in UniversalRenderPipeline.cs. SRPDefaultUnlit and passes with
// no LightMode tag are also rendered by Universal Render Pipeline
Name "ForwardLit"
Tags{"LightMode" = "UniversalForward"}
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local_fragment _OCCLUSIONMAP
#pragma shader_feature_local _PARALLAXMAP
#pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
#pragma shader_feature_local_fragment _SPECULARHIGHLIGHTS_OFF
#pragma shader_feature_local_fragment _ENVIRONMENTREFLECTIONS_OFF
#pragma shader_feature_local_fragment _SPECULAR_SETUP
#pragma shader_feature_local _RECEIVE_SHADOWS_OFF
// -------------------------------------
// Universal Pipeline keywords
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS
#pragma multi_compile _ _MAIN_LIGHT_SHADOWS_CASCADE
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
#pragma multi_compile_fragment _ _ADDITIONAL_LIGHT_SHADOWS
#pragma multi_compile_fragment _ _SHADOWS_SOFT
#pragma multi_compile _ LIGHTMAP_SHADOW_MIXING
#pragma multi_compile _ SHADOWS_SHADOWMASK
#pragma multi_compile_fragment _ _SCREEN_SPACE_OCCLUSION
// -------------------------------------
// Unity defined keywords
#pragma multi_compile _ DIRLIGHTMAP_COMBINED
#pragma multi_compile _ LIGHTMAP_ON
#pragma multi_compile_fog
#pragma vertex LitPassVertex
#pragma fragment LitPassFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitForwardPass.hlsl"
ENDHLSL
}
Pass
{
Name "ShadowCaster"
Tags{"LightMode" = "ShadowCaster"}
ZWrite On
ZTest LEqual
ColorMask 0
Cull[_Cull]
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
// -------------------------------------
// Material Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma vertex ShadowPassVertex
#pragma fragment ShadowPassFragment
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/ShadowCasterPass.hlsl"
ENDHLSL
}
Pass
{
Name "DepthOnly"
Tags{"LightMode" = "DepthOnly"}
ZWrite On
ColorMask 0
Cull[_Cull]
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#pragma vertex DepthOnlyVertex
#pragma fragment DepthOnlyFragment
// -------------------------------------
// Material Keywords
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthOnlyPass.hlsl"
ENDHLSL
}
// This pass is used when drawing to a _CameraNormalsTexture texture
Pass
{
Name "DepthNormals"
Tags{"LightMode" = "DepthNormals"}
ZWrite On
Cull[_Cull]
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
#pragma vertex DepthNormalsVertex
#pragma fragment DepthNormalsFragment
// -------------------------------------
// Material Keywords
#pragma shader_feature_local _NORMALMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
//--------------------------------------
// GPU Instancing
#pragma multi_compile_instancing
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/DepthNormalsPass.hlsl"
ENDHLSL
}
// This pass it not used during regular rendering, only for lightmap baking.
Pass
{
Name "Meta"
Tags{"LightMode" = "Meta"}
Cull Off
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
#pragma vertex UniversalVertexMeta
#pragma fragment UniversalFragmentMeta
#pragma shader_feature_local_fragment _SPECULAR_SETUP
#pragma shader_feature_local_fragment _EMISSION
#pragma shader_feature_local_fragment _METALLICSPECGLOSSMAP
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
#pragma shader_feature_local _ _DETAIL_MULX2 _DETAIL_SCALED
#pragma shader_feature_local_fragment _SPECGLOSSMAP
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitMetaPass.hlsl"
ENDHLSL
}
Pass
{
Name "Universal2D"
Tags{ "LightMode" = "Universal2D" }
Blend[_SrcBlend][_DstBlend]
ZWrite[_ZWrite]
Cull[_Cull]
HLSLPROGRAM
#pragma only_renderers gles gles3 glcore d3d11
#pragma target 2.0
#pragma vertex vert
#pragma fragment frag
#pragma shader_feature_local_fragment _ALPHATEST_ON
#pragma shader_feature_local_fragment _ALPHAPREMULTIPLY_ON
#include "Packages/com.unity.render-pipelines.universal/Shaders/LitInput.hlsl"
#include "Packages/com.unity.render-pipelines.universal/Shaders/Utils/Universal2D.hlsl"
ENDHLSL
}
}
FallBack "Hidden/Universal Render Pipeline/FallbackError"
CustomEditor "UnityEditor.Rendering.Universal.ShaderGUI.LitShader"
}
WorkflowMode
メタルネスワークフローかスペキュラワークフローかを決める
両者が持つ表現力はほぼ同じであるが、物理的な再現性と作業の効率性とでトレードオフの関係にある。
メタルネスワークフロー
スペキュラワークフロー
PBRであるため、拡散反射光と鏡面反射光は、入射光よりも大きくなってはいけない
スペキュラワークフローだと、ベーステクスチャマップとスペキュラテクスチャマップとでお互いを合算して1超えないようにテクスチャ制作で意識する必要があるのでメタルネスワークフローと比べて大変である
メタルネスワークフローは、金属・非金属をベーステクスチャマップ1枚のテクスチャに入れることができ、金属か非金属かの判定は、メタリックテクスチャマップで判定するだけなので、
スペキュラワークフローと比べてテクスチャ制作が楽である
Surface Type、Surface Type、Surface Type、Surface Type、Receive Shadows
Particles/Litで説明したため割愛
Base Map
ベースマップを設定。横のカラーピッガーと乗算する
Metallic / Specular Map
メタリックテクスチャマップとスペキュラテクチャマップを設定
金属度と表面の滑らかさ(Smoothness)をスライダーで用いて調整可能
ちなみに、メタリックテクスチャマップは使用しているのはRチャンネルのみなので、
他のチャンネルは以下のように使用されている
チャンネル | 内容 |
---|---|
R | メタリックフラグ(0=非金属/1=金属 ) |
G | オクルージョン量 |
B | 未使用 |
A | スムースネス量 |
また、SourceはSmoothness量を取得する時に参照するテクスチャマップを設定する
メタルネスワークフローだと
Surface Type | Source |
---|---|
Transparent | Albedo Alpha |
Opaque | Metallic Alpha、Albedo Alpha |
スペキュラワークフローだと
Surface Type | Source |
---|---|
Transparent | Albedo Alpha |
Opaque | Specular Alpha、Albedo Alpha |
Metallic/SpecularAlphaは、スペキュラあるいはメタリックマップのaチャンネルを参照する
AlbedoAlphaは、ベースマップのaチャンネルを参照する
Normal Map、Height Map、Occlusion Map
それぞれのマップを設定
マップを設定することで、横にスライダーが表示される
このスライダーでマップを調整できる
ちなみに、
Height Mapはノーマルマップよりも様々な角度ででこぼこ表現できるが、その分負荷が高い
Emission Map
エミッションマップを設定。横のカラーピッガーと乗算する
Mask
マスクマップを指定
マスクマップを作成して試してみたが、作成方法間違っているためなのかマスクできず
本来は下記のようにできるはず!
なお、シェーダーモデル 2.5 以降に対応する GPUのみ使用可能
Base Map
SurfaceInputsのBaseMapとテクスチャブレンドのようなことができる
スライダーで調整可能
BaseMapで使用するテクスチャ
BaseMapなし
BaseMapあり
なお、シェーダーモデル 2.5 以降に対応する GPUのみ使用可能
Normal Map
SurfaceInputsのNormalMapとテクスチャブレンドのようなことができる
Normal Mapで使用するテクスチャ
NormalMapなし
Normal Mapあり
なお、シェーダーモデル 2.5 以降に対応する GPUのみ使用可能
Specular Highlights
直接光のハイライトを描画できる。
オフにすると、パフォーマンスが向上する
Specular Highlightsオフ
Specular Highlightsオン
Environment Reflections
リフレクションプローブの反射を適用させるかどうか
オフにすると、パフォーマンスが上がる
Environment Reflectionsオフ
Environment Reflectionsオン
Enable GPU Instancing
GPUインスタンシングを適用させるかどうか
同じメッシュ・マテリアル使用する同士を一括して描画することによりドローコールを減らす
ただ、ハードウェアが対応していないとできない
Sorting Priority
マテリアルごとの描画順を決定する
こちらの値が小さいと先にレンダリングする
その結果、オーバドローを減らすことができる
Simple Lit
写実性よりもパフォーマンスが重要な場合は、このシェーダーを使用する。
ライティングに単純な近似を用いて、 物理的な正確さやエネルギー保存を計算しないため、
迅速にレンダリングできる
シェーディングモデルは Blinn-Phong モデルに基づいている。
インスペクターは以下である
インスペクターの内容は、Litとほぼ同じであるため割愛
Baked Lit
ライトマップ と ライトプローブ を使用した ベイクしたライティングを使用する際に使うシェーダである。
このシェーダーは 物理ベースシェーディング を使用せず、リアルタイムライティングも使用しないため、パフォーマンスが良い
ちなみに、ベイクとリアルタイムライティングの違いを動画で撮影してみた
Baked Lit
Lit
インスペクターは以下である
インスペクターの内容は、Litとほぼ同じであるため割愛
Complex Lit
LitにClearCoatを追加したシェーダである
ディファードレンダリングが使用できず、フォワードレンダリングのみ対応
また、Unity Shader Model 4.5 のハードウェアが必要になる場合があると公式ドキュメントに記載されているが、クリアコートのことか?。
インスペクターは以下である
Litとは、ClearCoatの違いだけなのでこちらのみ解説する
ClearCoat
クリアコート表現可能になる。
クリアコートとは、車のボディをぴかぴかに見せる塗料である
ただ、レンダリングのコストが2倍かかってしまう
ClearCoatオフ
ClearCoatオン
Maskマップを使用
ちなみに、こちらのMaskマップは、以下のようにチャンネルパッキングされている
Rが、Mask量
Gが、Smootness量
B、αが、なし
Unlit
ライトの計算を行わないので、他のシェーダと比べてコストがかからない
インスペクターは以下である
インスペクターの内容は、Litとほぼ同じであるため割愛
Lit、SampleLit、ComplexLit、Unlitの見た目の違い
LitとComplexLitはClearCoatがあるかないかの違いなので変わらない
LitとSampleLitは、近くの青い壁の間接光(画質がおちているせいか分かりづらい。。。)だったり、質感がやはり違う
Unlitは分かるとおりライティングの影響を受けていない
Lit
SampleLit
ComplexLit
Unlit
参考
Discussion