Unity – Shader 隨筆(09/04)

各式各樣的大小問題,八成不會整理這篇吧~(被毆

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) ?」,看起來似乎是個歷史遺毒…之類的吧~

但因為預射的幾個光照,都會有這個東西在,一旦移除,影響的範圍頗廣的…

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s