2009-02-02 19:52
高階渲染語言基礎
1:hlsl語法與c語法非常類似。
2:資料型別:bool int (32位signed) half(16位float) float(32位float) double(64位float)
3:變數宣告:與c一樣
4:型別修飾:可以使用const,與c++ 一樣
row_major 行主序 col_major列主序
5:暫存器修飾符:static extern
uniform :只能使用api方法來改變它,並且它只在兩次繪製間被改變.全域性變數和輸入的引數都可以定義成uniform,表示在shader執行期間值不變
shared : 修飾全域性shader變數表明它在不同的效果中被共享。當乙個變數被多個shader使用的時候,就使用shared來修飾,這樣更新變數的時候,所有shader都會被更新.
hlsl中所有的變數都是值傳遞,不允許用指標或者引用傳遞。
6:向量:
(1) bool3 bvector ; float2 bvector=;
(2)vectordvector=;在括號中指明型別和元素數
(3)乙個向量最多4個元素,每個都可以有兩種命名集合來定址。位置集合顏色集合
float4 pos=float4(0,0,2,1); pos.z=pos.b=2
可以一次讀取多個元素,但命名集合不能混合使用。
float2 temp;
temp=pos.rg :
temp=pos.xy:
(4)混合讀取:
float4 pos=float4(0,0,2,1):
float2 f_2d :
float4 f_4d;
f_2d=pos.xy;
f_2d=pos.xx;
f_2d=pos.yx;
f_4d=pos:
f_4d.xz=pos.xz;
f_4d.zx=pos.xz:
f_4d.xzyw=pos.w;
7:矩陣:
float2*2 fmatrix=
matrixfmatrix=
這種基準:_m00 _11,支援混合讀取,不能混合使用。
tempmatrix._m00_m11=worldmatrix._m13_m23;
fmatrix[0][0]支援陣列讀取。此法不能一次讀取兩個。
指定存放方式: #pragma pack_matrix(row_major)
#pragma pack_matrix(row_major)
列主序比行主序效率高。
float3*3 mat1, mat2;
float3*3 mat3=mat1*mat2; 逐個元素相乘
mat3=pos(mat1,mat2)矩陣向量間相乘。
8複雜資料型別:
(1)取樣器:
取樣器包含取樣狀態。取樣狀態指定取樣紋理,並控制紋理取樣期間的紋理過濾。取樣一幅紋理需要一幅紋理,乙個取樣器(帶有取樣狀態),乙個取樣指令。
取樣器可以在定義的同時初始化其紋理和取樣狀態,如下:
texture tex0;
sampler2d s_2d=sampler_state
以上定義的是線性紋理過濾,自動重複紋理定址方式
以下使用上面的紋理取樣器s_2d取樣一幅2d紋理:
//輸入乙個二元浮點數座標,返回資料報含兩個元素的色彩值r.g.
float2 sample_2d(float2 tex:texcoord0):color
如果沒有指定紋理取樣狀態,預設為線性過濾,重複定址。
hlsl支援4種取樣型別 sampler1d,sampler2d,sampler3d,samplercube,
對應取樣函式為tex1d,tex2d,tex3d tex1dcube。
(2)結構體:structure
成員不可以有初始化函式或者注釋。不可以使用帶範圍的關鍵字static extern const,volatile
(3)字串
在hlsl中,沒有操作符接收字串,但是,字串引數和注釋可以通過介面id3dxeffect訪問到。
(4)頂點渲染物件
頂點渲染物件:vertexshader,可以在組合語言的頂點渲染被編譯以後被賦值。也可以在hlsl頂點渲染之後賦值。
//hlsl
vertexshader vs=compile vs_2_0 vsmain() ;
//asm
vertexshader vs=
asm;
(5)畫素渲染物件
pixelshader:可以在組合語言的畫素渲染被編譯以後被賦值。也可以在hlsl畫素渲染之後賦值。
//hlsl
pixelshader ps=compile ps_2_0 psmain();
//asm
pixelshader ps=
asm;
(6)紋理
texture用於在效果中設定乙個紋理到裝置
texture tex0;
texture tex0為宣告,後面的為注釋,注釋是使用者提供給效果使用的資訊,被hlsl忽略。
9:表示式與運算子
%操作符當兩邊都是正數,或者都是負數時有定義,同時兩邊都是浮點數時也有定義,這與c不同。
投射:提公升投射:
float4 v ;
float f;
v=1;//v的四個元素都置成1
v=f;//v的四個元素都置成f
下降投射:
float4 c;
float3 a,b;
a=b*c;//c被轉化為float3
10:語句與c相同
11:函式
(1)格式說明
float4 light(float3 lightdir : texcoord1 , uniform float4 lightcolor,
float2 texcrd : texcoord0, uniform sampler samp):color
texcoord0 ,texcoord1是引數的語義,紋理為texcoord0 ,其餘未定義。
用uniform宣告的常量不會在繪製期間發生改變。這些引數**於渲染器全域性變數。
color為輸出語義。
函式宣告後還可以有注釋
引數還可以用inout in out 標示當前引數是輸入還是輸出。
(2)頂點渲染器語義
(3)畫素渲染器語義
(4)顯示暫存器繫結
編譯器會自動賦值暫存器到全域性變數中,同樣也可以把某些變數繫結到暫存器中。
sampler environment;
float4 k_s;
對於這3個全域性變數,編譯器會自動賦予environment到取樣暫存器中,把k_s賦值到常量暫存器中。為了強制編譯器賦值到乙個特殊的暫存器,可以使用register()語法
sampler environment :register(s1);
float4 k_s: register(cl2);
(5)內部函式
數學函式和取樣函式,2006.4版本提供了80多個內部函式。
(6)建構函式
float3 upvector=float3(0,1,3);
12段落:
vertexfragment (pixelfragment) +段落名稱+compile fragment+渲染器編譯目標+渲染器函式名稱
13:hlsl渲染的基本步驟:
編寫渲染**---檢查硬體裝置---編譯渲染**---建立渲染器---設定渲染器全域性變數---使用渲染器
14:渲染器編譯與除錯
通過sdk提供4種工具編譯:
fxc.exe 編譯hlsl渲染器 flink.exe 聯接hlslw段落
vsa.exe 編譯彙編頂點渲染器 psa.exe 編譯彙編畫素渲染器
4個工具位於sdk目錄/utilities/bin/x86資料夾下
語法: tool [switches] filename
15:渲染器字尾名vsh,psh, fx 分別表示頂點渲染哭檔案,畫素渲染器檔案,混合渲染器檔案
GPU程式設計優化筆記
參考 硬體上,gpu由多個sm steaming multiprocessor 構成,sm有多個warp,warp有多個sp streaming processor 乙個sp對應乙個執行緒。乙個warp中的sp執行相同的指令。block內部可以使用sm提供的shared memory和 syncth...
GPU程式設計例項
gpu是多核技術的代表之一,在一塊晶元上整合多個較低功耗的核心,單個核心頻率基本不變,一般在1 3ghz,設計重心轉向到多核的整合技術,gpu是一種特殊的多核處理器。本文在聯想深騰7000g gpu集群上進行實驗,該集群有100個節點,每個節點包含兩個4核cpu intel xeon 16gb記憶體...
GPU程式設計模型
gpu graphical processing unit 是顯示卡內用於圖形處理的器件。和cpu相比,cpu是序列執行,而gpu是多個核並行執行。gpu是乙個高效能的多核處理器,有很高的計算速度和資料吞吐率。在gpu上的運算能獲得相對於cpu而言很高的加速比。第 一 第二代gpu出現的時候,gpu...