本日はイベント登壇枠です。
本日IkwakenLabの公開イベント』に参加、登壇しました。
7月に開催されたイベントの二回目になります。
内容としては各7分でShaderに関してのフリートークが行われまsチア。
今回は筆者のパートの内容をまとめていきます。
〇パート1のおさらい
パート1(7/22日開催)ではShaderをこれから学びたい、ShaderGraph等で学習はしているけどもっとかけるようになりたいという方向けに筆者が学んできて躓いた部分などを踏まえShaderについてシェアしました。
具体的にはグラフィックスパイプラインの処理を追っていくこと、ShaderGraph→ShaderLabへ同じシェーダーを書き直してみることが学習としておすすめとシェアしました。
〇透明度
今回は筆者も躓いた透明度についての話とその中でのデバッグの方法を共有しました。
〇Unityで透明度を持つシェーダーの実装法
Unityで透明度を持つシェーダーの実装は次の2つの実装を組み込みます。
・RenderQueueを3000台にする
・Alpha Blendingの定義
なおURP、Built-Inに共通して実装できます。
具体的には次のようなコードになります。
Shader "Unlit/NewUnlitShader 1" { ・・・ SubShader { Tags { "Queue"="Transparent" } blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM ・・・ col.a = 0.5f
〇グラフィックスパイプライン上での透明/不透明オブジェクトの処理
不透明なオブジェクトに関しては一般的に奥にあるオブジェクトから手前のオブジェクトの順で塗りつぶされます。
しかし不透明なオブジェクトは透明なオブジェクトの描画が終わった後に『シェーダーで計算した色をすでに描画されている色に混ぜ合わせる形で重ね合わせます。』
つまりグラフィックスパイプラインでは『不透明オブジェクト』『半透明オブジェクト』を区別して描画しているということになります。
この区別にRenderQueueが使用されています。
〇RenderDocを使用して処理を見てみる
では実際にデバッグツールを使用して処理の流れを見てみます。
UnityではFrameDebuggerというツールがあるのですが、筆者はRenderDocと呼ばれるツールを愛用しています。
RenderDocをインストールしているPCではシーンウィンドウをみぎっくすることでLoad RenderDocというオプションを使用できます。
これによってGameもしくはSceneウィンドウでカメラアイコンが表示されRenderDocを使用できます。
RenderDocを使用することでGPU上の処理の流れを丸裸に出来、GPUのイベントを追っていると必ずDrawOpaqueObjectsの処理の後にDraw TransparentObjectのイベントが走っています。
RenderQueueが3000のオブジェクトがTransparentObjectとして処理されます。
この時に『すでに描画されたピクセル』に対してどのようにシェーダーで計算した色を合成するか?という設定がAlphaBlendingと呼ばれる処理の意味になります。
以上が本日のイベントでの発表内容になります。