各式各樣的大小問題,八成不會整理這篇吧~(被毆
Program ‘frag_surf’, NaN and infinity literals not allowed by shader model (compiling for d3d11_9x) at line 42
如字面上所說,要避免任何 NaN 和 infinity 的出現,這似乎在DX11蠻重要的吧?
範例:
更改前
float nh = max (0, dot (s.Normal, h));
更改後
float nh = max (0.0001, dot (s.Normal, h));
參考:「NaN and infinity literals not allowed by shader model 错误解决方法」
surface shader 的 Input 結構裡面的 uv & uv2
命名規則:[uv or uv2][貼圖名稱]
範例:
傳入的 texture 其中一張名為 _MainTex,那麼要以這張產生 uv 的話,就要將該變數命名為"uv_MainTex“。
估計這個和 vertex shader 處理 uv 時有關係(TRANSFORM_TEX 巨集)。
參考:「Shaders: Vertex and Fragment Programs」
Program ‘frag_surf’, Temporary register limit of 8 exceeded; 9 registers needed to compile program at line 20
這應該是和 ShaderModel 的限制有關係…應該XDD
所以,設定輸出的SM版本理論上就可以排除這個警告~
更改前
CGPROGRAM #pragma surface surf MyLighting // 略 ENDCG
更改後
CGPROGRAM #pragma surface surf MyLighting #pragma target 3.0 // 略 ENDCG
Program ‘vert_surf’, ‘separateSH’: output parameter ‘o’ not completely initialized (compiling for d3d11) at line 75
不知道哪個版本開始出現這個警告…
作個初始化即可~
更改前
void separateSH (inout appdata_full v, out Input o) { float3 worldN = mul ((float3x3)_Object2World, SCALED_NORMAL); o.shOcclusionAndAmbient = ShadeSH9 (float4(worldN,1.0)); }
更改後
void separateSH (inout appdata_full v, out Input o) { float3 worldN = mul ((float3x3)_Object2World, SCALED_NORMAL); o.shOcclusionAndAmbient = ShadeSH9 (float4(worldN,1.0)); }
Why (atten * 2) ?
這個從我一開始碰 ShaderLab 就一直存有疑問的地方…
google到了「Why (atten * 2) ?」,看起來似乎是個歷史遺毒…之類的吧~
但因為預射的幾個光照,都會有這個東西在,一旦移除,影響的範圍頗廣的…