環境: Unity2021.3.16f1 URP12.0.8
こちらはすでにURPのカスタマイズができる状態にしてることを前提に話を進めます
Unity の GBuffer の内容は以下のようになっており
GBuffer0、ARGB32 フォーマット: ディフューズ色 (RGB)、オクルージョン (A) GBuffer1、ARGB32 フォーマット: スペキュラー色 (RGB)、粗さ (A) GBuffer2、ARGB2101010 フォーマット: ワールド空間法線 (RGB)、不使用 (A) GBuffer3、ARGB2101010 (非 HDR) または ARGBHalf (HDR) フォーマット: エミッション + ライティング + ライトマップ + リフレクションプローブバッファ
GBuffer2 の a がなにかしらに使えることがあるかもしれないので、どうすれば変更できるのかを調査します
対象箇所
com.unity.render-pipelines.universal/ShaderLibrary/UnityGBuffer.hlsl
の以下の箇所が GBuffer に書き込んでいました
FragmentOutput BRDFDataToGbuffer(BRDFData brdfData, InputData inputData, half smoothness, half3 globalIllumination, half occlusion = 1.0) { ・・・ FragmentOutput output; output.GBuffer0 = half4(brdfData.albedo.rgb, PackMaterialFlags(materialFlags)); // diffuse diffuse diffuse materialFlags (sRGB rendertarget) output.GBuffer1 = half4(packedSpecular, occlusion); // metallic/specular specular specular occlusion output.GBuffer2 = half4(packedNormalWS, smoothness); // encoded-normal encoded-normal encoded-normal smoothness output.GBuffer3 = half4(globalIllumination, 1); // GI GI GI [optional: see OutputAlpha()] (lighting buffer) ・・・ }
変更してみる
GBuffer0 の値を書き換えてみます
-- output.GBuffer0 = half4(brdfData.albedo.rgb, PackMaterialFlags(materialFlags)); ++ output.GBuffer0 = half4(1, 0, 0, 0);
するとちゃんと赤になっていることが確認できました