うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】GBuffer に書き込む内容を変更する

環境: Unity2021.3.16f1 URP12.0.8

hacchi-man.hatenablog.com

こちらはすでに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);

するとちゃんと赤になっていることが確認できました