【「Unityシェーダーと画面特殊効果開発のヒント」】学習と仕上げ:モデルの頂点カラーの表示問題について

本日、モデルの頂点カラーを表示するサーフェス シェーダーを模倣中に問題が発生しました。コンパイラは次のエラーを報告しました:

'vert': 出力パラメータ 'o' が完全に初期化されていません
DIRECTIONAL
プラットフォームで Vertex プログラムをコンパイルしています 定義: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_USE_DITHER_MASK_FOR_ALPHABLENDED_SHADOWS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING UNITY_ENABLE_DETAIL_NORMALMAP SHADER_API_DE SKTOP UNITY_LIGHT_PROBE_PROXY_VOLUME

確認したところ、コード行の欠落が原因であることがわかりました。
より詳細な理由は、シェーダーのレンダー ターゲットが Directx 11 として定義されているためです。Unity5.x はデフォルトで Directx 11 になっているようです。
Directx 11 でレンダリングするには、頂点カラーの出力を適切に初期化する必要があります。
初期化のために UNITY_INITIALIZE_OUTPUT(Input, name) を追加する必要があります。

以下はシェーダーコードです

Shader "SurfaceShader/VertColor" 
    {
        Properties
        {
            _MainTint("Global Color Tint", Color) = (1, 1, 1, 1)
        }

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

            CGPROGRAM
            #pragma surface surf Lambert vertex:vert

            float4 _MainTint;

            struct Input
            {
                float2 uv_MainTex;
                float4 vertColor;
            };

            void vert(inout appdata_full v, out Input o)
            {
                //对输出进行初始化
                UNITY_INITIALIZE_OUTPUT(Input, o);
                //采集顶点色
                o.vertColor = v.color;
            }

            void surf(Input IN, inout SurfaceOutput o)
            {
                o.Albedo = IN.vertColor.rgb * _MainTint.rgb;
            }

            ENDCG
        }
    }

下の画像はUnity5.xのデフォルトシェーダーの効果です。
デフォルトのシェーダ
以下は、頂点カラー シェーダーを使用した同じモデルです。
モデルは頂点カラーを示します
最後は使用した素材ボールです。
頂点カラーシェーダ

このシェーダをコピーする過程で、上記の初期化の問題に加えて、別の問題も発生しました。

#pragma surface surf Lambert vertex:vert

このvertex:vert部分がコードの一部です。C#でスペースを含むフィールドを入力するのに慣れているので、最初はこの部分を書きましたが、vertex : vert
この部分は認識できない #pragma 命令であり、シェーダが動作しないという警告が表示されます。異常に走ること。

最後に、モデルの頂点カラーについて今のところわかっているのは、Maya で設定できるということですが、3dMax でできるかどうかはわかりませんが、この技術を使うことでテクスチャの数をある程度減らし、必要なテクスチャを保存できるようになります。モデルの頂点に関する情報を直接取得します。

おすすめ

転載: blog.csdn.net/EverNess010/article/details/79778004