找回密碼
 注冊帳號

掃一掃,訪問微社區

特定平臺的渲染差異

2015-1-8 15:54| 發布者: 楊炎| 查看: 1427| 評論: 0|原作者: 蠻牛|來自: unity3d腳本manual

摘要: 特定平臺的渲染差異unity 在不同的平臺上運行,而且在某些情況下存在運行差異。大部分時間里 unity 都向您隱藏差異,但有時您仍然可以撞見它們。渲染紋理坐標垂直紋理坐標的慣例與 direct3d、opengl 和 opengl es 不 ...

特定平臺的渲染差異

unity 在不同的平臺上運行,而且在某些情況下存在運行差異。大部分時間里 unity 都向您隱藏差異,但有時您仍然可以撞見它們。

渲染紋理坐標

垂直紋理坐標的慣例與 direct3dopengl 和 opengl es 不同:

在 direct3d 中,坐標頂部為零,向下增加。

在 opengl 和 opengl es 中,坐標底部為零,向上增加。

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

當使用圖像效果和抗鋸齒 (anti-aliasing) 時,不會出現這種情況。在此情況下,unity 渲染到屏幕以獲得抗鋸齒選項,然后將渲染“解析”為 rendertexture 以便用圖像效果 (image effect) 進一步處理。產生的圖像效果的源紋理在 direct3d 上沒有翻轉(不同于其他所有的渲染紋理 (render texture))。

如果圖像效果 (image effect) 簡單(一次處理一個紋理),這無關緊要,因為graphics.blit會進行處理。

然而,如果在圖像效果 (image effect) 中同時處理一個以上的 rendertexture,它們很可能會在不同的垂直方向出現(僅在類似 direct3d 的平臺上,并且僅在使用抗鋸齒選項時)。您需要在頂點著色器中手動“翻轉”屏幕紋理,像這樣:

//在 d3d 上使用 aa 時,主紋理與場景深度紋理

//將在不同垂直方向出現。

//因此在這種情況下翻轉紋理采樣(主紋理

//紋理元件大小將為 y 軸負值)。

#if unity_uv_starts_at_top

if (_maintex_texelsize.y < 0)

uv.y = 1-uv.y;

#endif

請在著色器替換樣例工程中查看邊緣檢測 (edge detection) 場景以了解這樣的示例。此處的邊緣檢測同時使用屏幕紋理和相機的深度 + 法線紋理。

alpha 測試 (alphatest) 和可編程著色器

某些平臺,尤其是手機 (opengl es 2.0) 和 direct3d 11,沒有固定函數alpha 測試功能。使用可編程著色器時,建議改為使用像素著色器的 cg/hlslclip()函數。

direct3d 11 著色器編譯器對語法更挑剔

direct3d 9 和 opengl 使用 nvidia 的 cg 來編譯著色器,但 direct3d 11(和 xbox 360)使用 microsoft 的 hlsl 著色器編譯器。hlsl 編譯器對著色器各種細微錯誤更挑剔。例如,它不接受沒有適當初始化的函數輸出值。

您會遇到此類情況的最常見位置是:

有一個“輸出”參數的表面著色器頂點修改器。確保像這樣初始化輸出:

void vert (inout appdata_full v, out input o)

{

unity_initialize_output(input,o);

// ...

}

部分初始化的值,例如返回 float4 的函數,但代碼僅設置它的 .xyz 值。確保設置所有的值,或如果只需要這些值,就將其改為 float3。

在頂點著色器中使用tex2d由于頂點著色器中不存在 uv 導數,因此 tex2d 無效;您需要抽取一個詳細的紋理層次,例如使用tex2dlod (tex, float4(uv,0,0))。您還需要添加#pragma glsl,使其在 opengl 上運行。

directx 11 hlsl 語法和表面著色器 (surface shader)

當前表面著色器編譯管線的有些部分無法理解特定于 dx11 的 hlsl 語法。如果是諸如 structuredbuffers、rwtextures 和其他非 dx9 語法的 hlsl 功能,則您必須將其納入只有 dx11 的預處理宏:

#ifdef shader_api_d3d11

// 特定于 dx11 的編碼,如

structuredbuffermycolors;

rwtexture2dmyrandomwritetexture;

#endif

使用帶 opengl es 2.0 的 opengl 著色語言 (glsl) 著色器

opengl es 2.0 只為 opengl 著色語言 (glsl) 提供有限的本地支持,例如 opengl es 2.0 層不為著色器提供內置參數。

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、msaa 和 alpha 混合幾何結構

當 msaa 已激活并且用 rgba colormask 繪制 alpha 混合幾何結構時,apple 驅動程序有產生假象的錯誤。為避免出現假象,遇到此配置時我們強制使用 rgba colormask,盡管它會將內置 glow fx 渲染成無法使用(因為它需要 dst_alpha 獲取強度值)。同時,如果您自己編寫程序,請更新著色器(請參閱pass docs)中的“渲染設置 (render setup) -> colormask”。)

相關閱讀

文章點評
相關文章
女校游泳队彩金 棋牌麻将手机游戏 财神捕鱼jdb官方版 今天浙江11选5开奖结果85期 新疆十一选五遗漏 排例五走势图 大赢家彩票软件购买 浙江体彩20选5预测 围棋培训 浙江快乐12开奖软件 吉林十一选五前三组走势图 彩名堂最新版 北京pk10谁控制的 广东快乐十分一彩票控 传奇链赚钱合法吗 体育彩票31选7推荐号码 pk10牛牛玩法介绍