unity shader _MainTex_TexelSize 和 UNITY_UV_STARTS_AT_TOP 的作用

我們先來看一段代碼:

#if UNITY_UV_STARTS_AT_TOP
if (_MainTex_TexelSize.y < 0)
{
    o.uv.w = 1 - o.uv.w;
}
#endif

_MainTex_TexelSize,這個變量的從字面意思是主貼圖 _MainTex 的像素尺寸大小,是一個四元數,是 unity 內置的變量,它的值爲 Vector4(1 / width, 1 / height, width, height)

在Direct3D平臺下,如果我們開啓了抗鋸齒,則xxx_TexelSize.y 會變成負值,好讓我們能夠正確的進行採樣。
所以if (_MainTex_TexelSize.y < 0)的作用就是判斷我們當前是否開啓了抗鋸齒。

unity的抗鋸齒選項在 project Setting->Quality->AntiAliasing,如圖:
這裏寫圖片描述


UNITY_UV_STARTS_AT_TOP 總是用1或0定義;
當紋理的V座標系原點在紋理頂部的平臺上值是1。
Direct3D類似平臺使用1;OpenGL類似平臺使用0。

所以 #if UNITY_UV_STARTS_AT_TOP 可以用來判斷我們是否是在 Direct3D 平臺下。


垂直紋理座標的慣例與 Direct3D、OpenGL 和 OpenGL ES 不同:

在 Direct3D 中,座標頂部爲零,向下增加。
在 OpenGL 和 OpenGL ES 中,座標底部爲零,向上增加。

大多數時候這都無關緊要,除了渲染到渲染紋理時。在此情況下,Unity 渲染到 Direct3D 上的紋理時,在內部翻轉渲染,以便平臺之間的慣例匹配。

如果我們做的屏幕後期特效簡單(一次處理一個紋理),這無關緊要,因爲 Graphics.Blit 方法會自動進行處理。

然而,如果在屏幕後期特效中同時處理一個以上的 RenderTexture,它們很可能會在不同的垂直方向出現(僅在類似 Direct3D 的平臺上,並且僅在使用抗鋸齒選項時)。您需要在頂點着色器中手動“翻轉”屏幕紋理。

所以也就有了上面的代碼,當滿足上面2個條件是,翻轉我們的圖像紋理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章