我們先來看一段代碼:
#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個條件是,翻轉我們的圖像紋理。