Open6
【Unity】Shaderを初めて学ぶ
環境
- Unity 2021.3.7f1 URP
参考
- この動画はほんとうに参考になりました。
https://youtu.be/wUx_Y9BgC7k - アマガミナさんのYouTubeリストも神
https://www.youtube.com/playlist?list=PLKDiJl9C6HD6m5P7COIEFW271-YtDDs2_ - Unity公式のShaderについてまとまったページ
https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/writing-shaders-urp-basic-unlit-structure.html - https://tech.spark-creative.co.jp/entry/2021/01/13/130743
トラブルシューティング: 何も表示されない
- URPのコアでサンプルプロジェクトを作ったところ、自作Shaderが何も描画されないという問題に直面した。
その際のShader
Shader "Unlit/DaraUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags {
"RenderType"="Opaque"
"RenderPipeline"="UniversalPipeline"
}
LOD 100
Pass
{
Name "ForwardLit"
Tags { "LightMode"="UniversalForward" }
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float fogFactor: TEXCOORD1;
float4 vertex : SV_POSITION;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
CBUFFER_END
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.fogFactor = ComputeFogFactor(o.vertex.z);
return o;
}
float4 frag (v2f i) : SV_Target
{
// sample the texture
float4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
// apply fog
col.rgb = MixFog(col.rgb, i.fogFactor);
return col;
}
ENDHLSL
}
}
}
- Shaderエラー(ピンク)にさえならない。
解決策①
- Render Queueを、
From Shader: 2000
から、Transparent: 3000
に変更したら表示された(が、違うよなこれは。。。)
解決策②
-
プロジェクトを作る際に、URPのテンプレートを用いて作成する
-
From Shader: 2000
のままで表示される
-
URPの設定かと思われるのであとで戻ってきて調査
頂点Shader操作例(Shader側で描画位置を操作)
- 実際のオブジェクトがscene上で置かれている位置からずらした位置に描画ができる。
- もともとの位置
- Shaderで変更後の位置
- Shader
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
// Shader側で描画位置を操作できる!
o.vertex.x += 1;
o.vertex.y += 1 * _ProjectionParams.x;
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.fogFactor = ComputeFogFactor(o.vertex.z);
return o;
}
頂点Shader操作例(TRANSFORM_TEX)
-
TRANSFORM_TEX
によって、TextureのTilingとOffsetが効いている。-
TRANSFORM_TEX
部分をコメントアウトすると効かない。
-
v2f vert (appdata v)
{
v2f o;
o.vertex = TransformObjectToHClip(v.vertex.xyz);
// o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv = v.uv;
o.fogFactor = ComputeFogFactor(o.vertex.z);
return o;
}
-
TRANSFORM_TEX
が有効な時
-
TRANSFORM_TEX
が無効な時
フラグメントシェーダー操作例(色の反転)
- もともとの上記の数字のテクスチャ色を反転させてみる
-
col = 1 -
の部分。(α値に関してはUnlitでは利用されていないようなので普通に見える)
-
float4 frag (v2f i) : SV_Target
{
// sample the texture
float4 col = 1 - SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv);
// apply fog
col.rgb = MixFog(col.rgb, i.fogFactor);
return col;
}