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值。



 葉思義、李震宇