GPU程式設計筆記(2)

2021-04-24 18:00:31 字數 4127 閱讀 3297

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...