未来を創る、テックコミュニティー

代表技術通信~Unityのことをちゃんと勉強する⑧ Shader再考

草場代表
2020/10/05

こんばんは。代表の草場です。

Unityの「No MonoBehaviour script in the file, or their names do not match the file name.」問題が全く解決せず、やばい。やばい。ということで、Shaderの勉強をしています。
動画の「シェーダを書けるプログラマになろう #1 シェーダを理解しよう – Unity道場2019 2月」がとてもわかりやすいです。
それを超える記事、「Unityシェーダプログラム入門 UnlitShaderの要素を全て解説」を発見。これはすごい。

Unityで右クリックメニューから作成できるシェーダのテンプレート「UnlitShader」内の全ての要素を解説します。「これはおまじないです」は一切使いません。本当に全ての要素を解説するので、この記事だけで普通の記事10個分くらいはボリュームがあります。

ほんと、すべて詳しく解説してくれています。ほんと勉強になります。

レンダリングパイプラインって、3D空間上に配置されたオブジェクトがデバイスの画面に表示されるまでの処理の流れのことだったのですね。
で、Unityではじめに出てくるテンプレート、HDRPは、ScriptableRenderPipeline(SRP)だったんですね。そして実は標準のレンダリングパイプラインの中にも「Forward」と「Deferred」の2種類があるそうです。詳しくは、「【Unity】ForwardレンダリングとDeferredレンダリングの違いを軽くまとめてみた」にとても詳しいです。

いざ、Shaderをいじろうと。Unityの画面で、Asset>Create>Shader>Unlit Shaderで、Shader作成。以下のファイルがデフォルトで作成されます。

Shader "Unlit/MyUnlitShader"
{
Properties
{
_MainTex ("Texture", 2D) = "red" {}

}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 100

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog

#include "UnityCG.cginc"

struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};

struct v2f
{
float2 uv : TEXCOORD0;
UNITY_FOG_COORDS(1)
float4 vertex : SV_POSITION;
};

sampler2D _MainTex;
float4 _MainTex_ST;

v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}

fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
// apply fog
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}

記事ではこれを細かく解説してくれています。一通りは勉強したので、改めて明日復習。

 

 

この記事を書いた人
草場代表
エディター