
|
|
HLSL語言補充說明
在本書第七章,我們介紹了用於繪圖的HLSL高階著色語言。HLSL使用了大量C語言的語法,這些對於C#的使用者會覺得很熟悉。同時它還增加了一些C或C#語言所沒有的特性,簡化了HLSL程式的撰寫。 以下首先我們來看看HLSL與C/C#語言的相同之處: 結構與陣列 對任何程序化的傳統程式語言來說,結構與陣列是資料處理上最常用的複合式資料型別。HLSL支援了與C語言相同的結構與陣列語法,讓我們在shader程式中可以很方便的用來表達各種3D圖學中常用的資料型態。 C語言的運算子 HLSL中允許我們用C語言中常用的運算命令。除了基礎的加減乘除,包括很多程式師最喜愛的 ++ 與 --。而bool 型別可以使用 "||", "&&" 等邏輯運算。當然你也可以使用 "+=" 或是 "-=" 這類指定運算子。另外一個C語言程式師喜歡用的 "?:" 這種條件運算也是支援的。 程式流程控制 HLSL語言支援比較精簡的C語言流程控制命令如 do, while, if, for, break, continue 等,但是不支援如goto 與 switch 等命令。 前處理 HLSL支援C語言的前處理條件判斷如 #ifdef 與最常用的 #define
接著我們來看看HLSL又增加了哪些原本C語言沒有的語法: 內定的建構函數 在HLSL中我們可以直接使用內定的建構函數來指定值如: float4 homo_pos = float4(1.0, 2.0, 3.0, 1.0); 取部分結構值 HLSL允許我們使用非常有彈性的方法來取值。譬如: float4 homo_pos = float4(1.0, 2.0, 3.0, 1.0); float sc = homo_pos.y; // y = 2.0 float2 uv = homo_pos.zw; // uv = (3.0, 1.0) float3 xxx = homo_pos.yyy; // xxx = (1.0, 1.0, 1.0) 指定暫存器 HLSL可以直接指定某個變數使用特定的暫存器 (繪圖卡暫存器)。譬如: float4 pos : register (c0); // 指定HLSL把暫存器c0用來存放pos值。
|