對WoW Shader檔案的分析

2021-09-08 21:22:52 字數 3323 閱讀 9460

wow的渲染引擎是同時支援固定渲染管線渲染和shader渲染管線渲染的.

bls檔案是wow的shader檔案,分析它的實現可以學習引擎是怎樣渲染的,以及如何做乙個相容固定管線和shader管線的引擎.

bls裡儲存的是opengl low-level shading language的指令,terrain1.bls,terrain2.bls,terrain3.bls,terrain4.bls分別對應渲染一塊具有1/2/3/4層的紋理地形.terrain1_s.bls,terrain2_s.bls,terrain3_s.bls,terrain4_s.bls分別對應渲染帶高光反射的地形,其對應使用的是帶有_s的地形紋理.

雖然shader可以按任何演算法和順序來混合使用各層紋理,但wow的shader的使用仍受限於與固定管線的相容,使用arbfp1.0標準,仍然是按標準紋理層次先後疊加.從使用的紋理可以看出,

layer0texture,layer1texture,..,,blendtexture,其中blendtexture的每乙個分量都是乙個alpha圖,

地形塊為3層紋理時,第一層直接渲染不需要alpha圖,第2,3層各需要一張alpha圖,即共需2張alpha圖,這2張alpha圖儲存在blendtexture的x,w分量上.

使用4層紋理時,使用blendtexture的x/y/w作3張alpha圖.

由於最多有4層地形紋理,blendtexture的z就剩下來作為陰影圖使用,完成了整個地形塊的shader. 編輯

收藏引用 所屬分類: 3d圖形學研究

wow 的圖象引擎是什麼公司做的啊?

2006-03-03 15:49 |

嗯,是他們自己開發的引擎.

2006-03-03 20:05 |

to ori

你在這裡找苦力來了?

2006-03-06 09:48 |

分析模型,解放資源都是linghuye老大的樂趣、愛好,何苦之有?

我也非常想做這些,雖然自已技術淺薄,但樂此不彼!

2006-03-06 10:15 |

2006-03-09 18:13 |

就是sdl_opengl.h沒有,

2006-03-09 18:14 |

2006-03-09 19:11 |

如果針對不同的紋理層數設計不同的pass,那就是說wow的地形確實是按chunk來渲染的?那dp呼叫會不會太多了?而且要不停的切換紋理……

2006-05-20 16:04 |

我的意思是,如果按紋理來渲染,就是說對於當前每種可見的紋理都渲染一次,每次渲染都提供一張該紋理對應的alpha圖(第一層不需要),當然這樣就要求執行時把每種紋理對應的mesh組織好。這樣渲染的優點是dp呼叫少,多少種紋理就多少次dp呼叫,而且不用頻繁切換紋理;缺點是多層紋理重疊的象素實際上被渲染了多次,而且大部分頂點也都要被處理多次……說的我自己都沒底氣了,到底密集細碎的dp呼叫能多大程度影響效率這個我也沒有經驗,回頭試一試。

wow基本是沒有lod的(最多可以有兩級好象),如果使用lod的話,那麼最壞的情況下對於遠處的乙個chunk可能乙個dp呼叫只繪製了兩個三角形,想起來就相當不爽

2006-05-20 16:21 |

2006-05-21 12:11 |

dp可能是drawpramitive函式, d3d的

2006-05-22 09:11 |

對,dp就是指d3d的drawprimitive(drawindexedprimitive)。

按紋理不按chunk渲染,具體說就是對於每種紋理,都把用到該紋理的chunk的頂點都拼成乙個大vertex buffer(或index buffer),用一張alpha圖(實際上只需要乙個通道)來控制該層紋理在每個頂點位置的混合權重。這樣對每層紋理渲染一次就得到最終的結果了。

2006-05-22 15:43 |

這只是我初步的考慮,還沒有實踐過。我會把兩種方案都試一下,哪種效率高應該很容易判斷。

2006-05-22 15:48 |

我認為按紋理渲染不是效率上的問題,而是我懷疑根本做不出wow中的地形紋理混合的效果.我所知道的渲染公式是 (a * (1-a1) + b * a1)) * (1-a2) + c * a2,不是a * a0 + b * a1 + c * a2這種簡單的權重混合.

我曾經想過按材質分類渲染,結論是不可行,只能盡可能減少紋理材質切換,但不能完全按材質分類渲染.

wow的alpha層資料是依附於每個chunk給出的,所以按chunk渲染是比較自然地,減少材質切換的優化建立在以chunk為渲染單位上,即歸類具有相同層數,使用相同shader,使用相似紋理的chunk.

不過,期待你的實踐.

// 順便說一下,不喜歡dp這樣的縮寫,我用opengl,比較喜歡vbo,pbo,rtt,:),just joking.

2006-05-22 23:28 |

我之前已經實現了。

方法是渲染每層細節紋理時都提供兩個texturestage給顯示卡:stage0是alpha圖(也就是只用到該圖的alpha通道,如果用可程式設計管線實際上最多可以把4層alpha塞到乙個alpha圖里),對於這一層,color取current,alpha取texture;stage1是紋理本身,color取texture,alpha取current。之後在幀快取裡把這一層紋理和前面的結果混合:srcblend設為srcalpha,destblend設為invsrcalpha。也就是說對於每一層紋理都是:res_n = cur_n-1 * ( 1 - alpha_n ) + color_n * alpha_n

2006-05-23 14:04 |

不好意思我這裡說的都是d3d的東西,ogl沒有用過不過應該也有類似的概念吧

2006-05-23 14:05 |

我後來看了一下wow地形渲染bls檔案,之前都是用hlsl,彙編形式的看的比較吃力,不過還是看明白了。

我認為你看的不夠仔細,alpha圖的x,y,z通道分別對應第1,2,3層紋理的alpha權重(如你所說,和疊加順序有關),w通道應該是陰影值(1為陰影,0為正常),而且能看出最終遮蔽了陰影中的高光,保留了70%的diffuse亮度。

2006-05-30 17:00 |

to 平民程式,

我和你的理解是完全一致的,也實現了類似的室外地形。這裡有一點點細微的差別,就是wow也許是把blend factor儲存在了貼圖中,然後在ps裡面sampler,而我是直接增加了乙個vertex stream, 儲存float4 的alpha值,使用texcoord1的語意,讓頂點渲染引擎直接進行插值。

樓主我很想和你交個朋友,我人在上海。

2007-07-09 18:23 |

lol can't read nothing

all is chinese :(

對報表 FRX檔案的分析

其實報表 檔案.frx是乙個表,其.fpt是乙個備註庫,其庫結構和一般自由表沒什麼不同,都可以use開啟他的?frx,其欄位總共有74項,分別介紹如下,希能給大家有所幫助 欄位名稱型別長度小數說明 1platformc8操作平台 或 windows 2uniqueidc10唯一標識 當name合ex...

對報表 FRX檔案的全面分析

其實報表檔案.frx是乙個表,其.fpt是乙個備註庫,其庫結構和一般自由表沒什麼不同,都可以use開啟他的?frx,其欄位總共有74項,分別介紹如下,希能給大家有所幫助 欄位名稱 型別 長度 小數 說明 1 platform c 8 操作平台 dos或 windows 2 uniqueid c 10...

對 lds連線指令碼檔案的分析

本文由jacky原創,來自http blog.chinaunix.net u1 58780 showart.php?id 462971 對於.lds檔案,它定義了整個程式編譯之後的連線過程,決定了乙個可執行程式的各個段的儲存位置。雖然現在我還沒怎麼用它,但感覺還是挺重要的,有必要了解一下。先看一下g...