高級著色器語言(即 HLSL,縮寫自High Level Shader Language或High-Level Shading Language),是由微軟擁有及開發的一種著色器語言,最初的開發是為了輔助Direct3D 9的著色器彙編語言,後成為 Direct3D 10 以來統一著色器模型所必須的語言。
HLSL只能供微軟的Direct3D以及XNA使用。HLSL是GLSL的先輩,同時不能與OpenGL標準兼容。他跟Nvidia的Cg非常相似。
HLSL的主要作用為將一些複雜的圖像處理,快速而又有效率地在顯示卡上完成,與組合式或低階Shader Language相比,能降低在編寫複雜特殊效果時所發生編程錯誤的機會。
基本介紹
- 中文名:高級著色器語言
- 外文名:High Level Shader Language
- 縮寫:HLSL
- 又稱:高級著色語言
開發背景介紹,研究意義與現實意義,範例,
開發背景介紹
正如通用處理器上的軟體開發從彙編語言程式設計逐漸過渡到高級語言程式設計一樣,著色程式丌發也在經歷著同樣的發展過程。低級著色語言雖然能夠滿足大多數圖形套用的需要,允許開發者寫出性能優異的著色程式,以最大程度地利用圖形處理器的硬體能力,但是它不可避免的具有下述問題:
1)對底層圖形硬體具有強烈的依賴性。雖然DirectX、OpenGL等3DAPI可以通過定義虛擬機抽象底層硬體的體系結構,但是正如我們所看到的,用他們編寫著色程式時仍然不得不選擇某一個具體版本的低級著色語言來匹配底層的圖形硬體。
2)低級著色語言難以學習,開發效率較低。難學習、難使用是彙編語言的通性,而圖形處理器的向量體系更加增大了學習和使用的難度。
3)無法直接利用大量現存的Rendemaan shader。
4)不能利用廣泛使用的各種最佳化編譯技術,開發者必須手工最佳化彙編代碼。
為此,高級著色語言進入研究者的視野。2001年Pat Hanrahan等在siggraph上提出了一個實時過程著色系統:斯坦福著色系統[Pat2001]。該系統出三部分組成,第一部分是對可程式圖形流水線的一個拙象,第二部分是一個類似於Renderman著色語言的高級著色語言,第三部分是一個支持多後端的後端編譯器。此後不久,商業化的高級著色語言相繼出現,它們是Cg、DireetX HLSL與OpenGL glslang。Cg山nVidia公司和微軟公司聯合丌發而成,是一種增加了向量與矩陣處理能力的類c語苦。Cg的設計目標是成為一種通用的面向硬體的語言。它既可以用來開發用於渲染的著色程式,也可以用來開發在圖形處理器上運行的科學計算程式。cg是~個跨平台的高級著色語言,通過定義不同的配置(profile),cg編譯器可以為不同的低級著色語言後端生成代碼,既支持DireetX所有版本的低級黃色語言,也支持OpenGL所有版本的低級著色語言.同時還支持nVidia專有的所有版本的低級著色語言。DirectX HLSL類似於cg,但是它的後端僅支持DirectX各個版本的低級著色語言。
Glslang是OpenGL Shading Language的簡稱,它是OpenGL 2.0規範的一部分,是OpenGL平台上的高級著色語言。Glslang在OpenOL管理委員會的監督下,由3D Labs公司制定規範和提供參考實現。它的設計目標是能夠體現當前和未來圖形硬體能力,易於使用,功能強大,可以明顯減少日漸增加的OpenGL擴展數目。
研究意義與現實意義
1)使用高級著色語言是實現商質量實時渲染套用的必然選擇。要充分利用圖形硬體的可程式能力,擺脫低級著色語言對具體圖形硬體的依賴性,提高工作效率,降低開發成本,利用已經存在的大量優秀Renderman shader,以實現電影質量實時圖形渲染,就必然要使用高級著色語言。
2)現代圖形處理器的硬體能力越來越強,正在由專用圖形處理器向著通用流處理器的方向發展。在圖形處理器上進行通用計算具有很好的套用前景,並且當前已經取得令人滿意的成績。例如史丹福大學的Brook項目[Buck031]。高級著色語苦的功能也會相應的發展,添加越來越多的高級語言特性。這點從各種高級著色語言保留的關鍵字就可以看出來。
3)‘t'i-能對於實時圖形渲染具有舉足輕重的意義。丌發者只有在確信HLSL編譯器產生的代碼在性能上可以和手寫LLSL代碼相比時才會選擇使用HLSL。因此,必須對HLSL的最佳化編譯進行深入研究。
範例
- 灰階值 = 0.3 x 紅 + 0.59 x 綠 + 0.11 x 藍
sampler2D Texture0; float4 ps_main( float2 texCoord : TEXCOORD0 ) : COLOR{ float4 _inColor = tex2D( Texture0, texCoord ); float gray = 0.3*_inColor.x + 0.59*_inColor.y + 0.11*_inColor.z; float4 _outColor = float4(gray, gray, gray, 1.0); return _outColor;}