[譯]Unity – Platform Specific Rendering Differences

原文:Platform Specific Rendering Differences

Unity 在不同的平台上執行時,在某些情況下同樣的東西會造成不一樣的結果。大多時候,Unity 會隱藏這個差異,但有時候你仍然可以接觸到它們。

Render Texture Coordinates

Vertical texture coordinate 在 Direct3D, OpenGL 和 OpenGL ES 的差異:

  • 在 Direct3D,texture coordinate 是從頂部為0開始,向下增加。
  • 在 OpenGL 和 OpenGL ES,texture coordinate 是從底部為0開始,向上增加。

大部分的時候這個不是甚麼問題,除了要繪製到 RenderTexture。在那狀況下,Unity 會在以 Direct3D 繪製時自行反轉,所以就可以適用到各平台。

只有在某個狀況下並不會作用,那就是 Image Effects 和 Anti-Aliasing 同時使用時。在這個狀況,Unity 會先繪製到螢幕上取得 anti-aliasing,接著"分解(resolves)"套上 Image Effect 的處理,繪製到 RenderTexture。這個丟給 image effect 的 source texture 在 Direct3D 裡並"沒有經過反轉“的!! (也就是和所有其他沒有用到 AA 或 Image Effect 的 RenderTexure 不同)

但是,如果你在你的 Image Effect 裡面一次處理多個 RenderTexture 的話,極有可能造成不同的垂直方向(這只會在 Direct3D並且使用 Anti-Aliasing時發生)。你需要在你的 vertex shader裡面手動"反轉" screen texture,就像是:

// On D3D when AA is used, the main texture & scene depth texture
// will come out in different vertical orientations.
// So flip sampling of the texture when that is the case (main texture
// texel size will have negative Y).
#if SHADER_API_D3D9
if (_MainTex_TexelSize.y < 0)
        uv.y = 1-uv.y;
#endif

請參考在 Shader Replacement sample project 裡面的 Edge Detection scene。Edge Detection 會使用 screen 和 camera’s Depth+Normals 的這兩個 texture。

Using OpenGL Shading Language (GLSL) shaders with OpenGL ES 2.0

OpenGL ES 2.0 只支援原生的 OpenGL Shading Language (GLSL),例如 OpenGL ES 2.0 就沒有提供關於 layer 的內建參數。

Unity 為你所準備的內建參數,就如同 OpenGL 一樣,但是會沒有以下幾個內建的參數:

  • gl_ClipVertex
  • gl_SecondaryColor
  • gl_DepthRange
  • gl_LightSourceParameters 結構裡面的屬性 halfVector
  • gl_FrontFacing
  • gl_FrontLightModelProduct
  • gl_BackLightModelProduct
  • gl_BackMaterial
  • gl_Point
  • gl_PointSize
  • gl_ClipPlane
  • gl_EyePlaneR, gl_EyePlaneS, gl_EyePlaneT, gl_EyePlaneQ
  • gl_ObjectPlaneR, gl_ObjectPlaneS, gl_ObjectPlaneT, gl_ObjectPlaneQ
  • gl_Fog

iPad2 and MSAA and alpha-blended geometry

在 Apple 的裝置上,當 MSAA 啟用時,alpha-blended geometry 繪製到 non RGBA 的 colorMask會造成顯示上有問題。為了防止這個問題,當遇到這個狀況時,我們會強制弄成 RGBA colorMask。也因此會造成內建的 Glow FX 無法使用(它需要使用 DST_ALPHA 作為 intensity 值)。還有,如果你是使用自己寫的 shader,請更新它們(參考在 Pass Docs 裡面的 “Render Setup -> ColorMask")。

One thought on “[譯]Unity – Platform Specific Rendering Differences

  1. 通告: Unity – Radial Blur Filter | NaCl's Blog

發表迴響

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

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