土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

#unity シェーダーまわりのtips

 GWはシェーダー本4の執筆をメインに考えてまして、その最中で気づいた小ネタはこのエントリに随時追加していこうと思います。特記がなければSRP/UniversalRP/Litシェーダーの話です。

MaterialEditor.TextureScaleOffsetPropertyメソッドの引数1個版

ソース読んでて気づいたのでメモ

docs.unity3d.com


MaterialEditor.TextureScaleOffsetPropertyメソッド、公式ドキュメントでは引数2個と3個のインターフェースしか書いてありませんが、BaseShaderGUI.csに引数1個の利用例がありました。

        protected static void DrawTileOffset(MaterialEditor materialEditor, MaterialProperty textureProp)
        {
            materialEditor.TextureScaleOffsetProperty(textureProp);
        }

単なる記載漏れな気もします。

マテリアル拡張エディタの特殊メソッド

マテリアルの拡張エディタ読んでて「このチェックボックスのラベルはどうやって表示してるんだろう?」と悩んだ時、大抵MaterialEditorに専用のメソッドが用意されてて「なんでだよ!」ってなります。以下今日見つけた分。

  1. MaterialEditor.EmissionEnabledProperty
  2. MaterialEditor.TextureScaleOffsetProperty
  3. MaterialEditor.EnableInstancingField

頼む、これで全部であってくれ!

COLORセマンティクスの話

 モデルデータの頂点カラーを取得するには頂点シェーダーでCOLOR入力セマンティクスを使うのですが、Litシェーダーの入力は以下のようになっていて、COLORが含まれていません。

struct Attributes
{
    float4 positionOS   : POSITION;
    float3 normalOS     : NORMAL;
    float4 tangentOS    : TANGENT;
    float2 texcoord     : TEXCOORD0;
    float2 lightmapUV   : TEXCOORD1;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

 これStandardシェーダーではどうだったっけと思ったら、実はそっちでも使っていませんでした。モダンゲーム開発では頂点カラーって随分前から使ってないんでしょうか。確かに今更使いどころのあるパラメータではなさそうですが、ちょっと意外でした。

_GlossMapScale

Litシェーダーの_GlossMapScaleって変数、これ互換性の為に遺されてるだけで、すでに使ってない物の筈なんだけど、Lit.shader見ると2回宣言されてて、これミスなのかなあ?
f:id:t_tutiya:20200429133746p:plain

DirectBDRF関数

 DirectBDRF関数の中のコメント分で、BRDFspec式を説明している箇所が実コードと処理が一致せず、散々悩んだ上で、最終的に「必須の括弧が1対無い」という結論に。間違ってたらごめんなさい。

誤
    // Final BRDFspec = roughness^2 / ( NoH^2 * (roughness^2 - 1) + 1 )^2 * (LoH^2 * (roughness + 0.5) * 4.0)
正
    // Final BRDFspec = roughness^2 / (( NoH^2 * (roughness^2 - 1) + 1 )^2 * (LoH^2 * (roughness + 0.5) * 4.0))