本日、モデルの頂点カラーを表示するサーフェス シェーダーを模倣中に問題が発生しました。コンパイラは次のエラーを報告しました:
'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 でできるかどうかはわかりませんが、この技術を使うことでテクスチャの数をある程度減らし、必要なテクスチャを保存できるようになります。モデルの頂点に関する情報を直接取得します。