日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DirectX 高级着色语言HLSL入门

發布時間:2025/4/14 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DirectX 高级着色语言HLSL入门 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了編寫著色器程序,我們需要一種高級著色器語言(High-Level Shading Language ,簡稱HLSL) 。 在DirectX 8中,著色器是用低級著色器匯編語言編寫的。
DirectX 9支持一種高級著色器語言來寫。
使用HLSL 編譯器,我們可以編譯我們的代碼到任何可用shader版本,使用匯編語言我們將不得不為每個需要的版本移植代碼。
HLSL 同C和C++語法很類似。

在記事本中編寫著色器并保存成一般的ASCII文本文件,然后可以用D3DXCompileShaderFromFile函數來編譯它們。

下面用HLSL編寫的一個簡單的頂點著色器,用記事本生成并保存成文本文件“VertexShader.cxx”。
頂點著色器用組合視圖和投影矩陣轉換頂點,并設置頂點漫射光為紅色。

matrix g_view_proj_matrix;const vector RED = {1.0f, 0.0f, 0.0f, 1.0f};struct sVertexInput{vector position : POSITION;};struct sVertexOutput{vector position : POSITION;vector diffuse : COLOR;};sVertexOutput main(sVertexInput input){sVertexOutput output = (sVertexOutput)0; output.position = mul(input.position, g_view_proj_matrix); output.diffuse = RED; return output;}


首先是2個全局變量:

matrix g_view_proj_matrix;
const vector BLUE = {0.0f, 0.0f, 1.0f, 1.0f};

第1個變量g_view_proj_matrix是矩陣類型,它是一個在HLSL內創建的4×4的矩陣類型。這個變量保存視圖與投影的組合矩陣,它描述兩者的變換。使用這種方法我們只要做一個向量和矩陣的乘法(而不是二個)。在著色器源代碼的任何地方都沒有初始化這個變量,因為它是我們在應用程序的源代碼里設置的,而不是在著色器中。從應用程序向著色器程序通訊是常用的操作。
第二個變量BLUE是built-in(內建)類型的4D向量,我們簡單的將它初始化成藍色,它是個RGBA的顏色向量。

輸入和輸出結構
在全局變量定義之后,定義2個特殊的結構,我們調用輸入和輸出結構。對于頂點著色器而言,這些結構定義了頂點的數據,分別是:

struct sVertexInput
{
? vector position : POSITION;
};

struct sVertexOutput
{
? vector position : POSITION;
? vector diffuse : COLOR;
};

注意:給像素著色器的結構定義輸入和輸出像素數據。
在例子中,INPUT 頂點著色器只包含位置成員(POSITION),OUTPUT頂點著色器包含位置和顏色成員(POSITION and COLOR)。

特殊的冒號是一種語義,用于是聲明變量。這與vertex結構中的自由頂點格式(FVF)相似。
": COLOR"是說頂點的漫射光是用sVertexOutput結構的COLOR成員來說明的。
注意:從底層來說,著色器變量的語義和語法同硬件寄存器是相關聯的。
即,input變量與input寄存器關聯,output變量與output寄存器關聯。例如,sVertexInput中的position成員與頂點input的position寄存器相關聯。同樣,diffuse與頂點的output的color寄存器關聯。

函數的入口點
在C++程序中,每個HLSL程序有一個入口點。在我們的著色器例子中,我們調用入口點函數main。然而名字不是強制的。入口點函數名可以是任何有效的函數名,入口點函數必須有一個input結構參數,它通過input頂點進入著色器。入口點函數必須返回一個output結構實例,在著色器中使用output操作頂點。

sVertexOutput main(sVertexInput input)
{

 注意:實際上,使用input、output結構不是強制的。例如,有時你將會看到使用類似下面的語法,特別是在像素著色器中:

float4 Main(in float2 base : TEXCOORD0,
? ? ? ? ? ? in float2 spot : TEXCOORD1,
? ? ? ? ? ? in float2 text : TEXCOORD2) : COLOR
{
...

}


例子中,輸入到著色器中的參數是3個紋理坐標。著色器輸出(返回)一個顏色,COLOR語句在函數的聲明以后。這種定義是類似于:?
?

struct INPUT
{
? ? ?float2 base : TEXCOORD0;
? ? ?float2 spot : TEXCOORD1;
? ? ?float2 text : TEXCOORD2;
};

struct OUTPUT
{
? ? ?float4 c : COLOR;
};
?
OUTPUT Main(INPUT input)
{
...

}


輸入點函數負責根據給定的input頂點計算output頂點。例子中的著色器簡單的變換input頂點到視圖空間和投影空間,設置頂點顏色為紅色,并返回結果頂點。首先我們定義sVertexOutput的實例并初始化所有成員為0。

sVertexOutput output = (sVertexOutput)0;
 

然后著色器變換input頂點位置用g_view_proj_matrix變量,使用mul函數。它是一個built-in(內建)函數,實現向量與矩陣相乘,或矩陣與矩陣相乘。我們保存結果變換的向量(在output實例的position成員中)。

output.position = mul(input.position, g_view_proj_matrix);


然后設置output的成員diffuse的顏色為紅色:
output.diffuse = RED;

 
最后返回結果向量:
return output;
}

總結

以上是生活随笔為你收集整理的DirectX 高级着色语言HLSL入门的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人网址 | 国产黄色大片免费看 | 国产欧美一区二区精品久久久 | 日韩亚洲精品在线 | 日韩美女视频在线 | 日本中文字幕高清 | 在线欧美亚洲 | 国产一区自拍视频 | 成av在线| 天天玩天天操 | 美国色视频 | 欧美人体做爰大胆视频 | 欧美久久99| 玉米地疯狂的吸允她的奶视频 | 国产激情精品 | 在线99热 | 欧美偷拍视频 | 国产精久久一区二区三区 | 中文字幕在线导航 | 欧美激情视频在线 | 亚洲精品美女视频 | 国产成人aaa | 黄频在线播放 | 自拍偷拍一区二区三区 | 黄色18网站| 麻豆视频网 | 国产精品蜜臀av | 九九在线精品 | 国产成人精品无码免费看夜聊软件 | 欧美自拍偷拍一区 | www.555国产精品免费 | 精品久久久久久久久久久久久 | 人妻体体内射精一区二区 | 国产女人在线观看 | 成人久色| 激情五月婷婷 | 在线中文字幕网站 | 看全色黄大色黄大片女一次牛 | 欧美黑人做爰爽爽爽 | 久久99国产精品久久99果冻传媒 | 欧美xxxxx牲另类人与 | www黄色网址 | 97超碰人人模人人人爽人人爱 | 91av不卡| 蜜桃av久久久亚洲精品 | 精品国产999久久久免费 | 久久无码国产视频 | 欧美色图在线播放 | 岛国片在线免费观看 | 国产成人精品一区二区三区免费 | 国产又粗又黄又爽 | 午夜网站在线 | 日本一本在线观看 | 一级片在线免费观看视频 | 超碰91在线观看 | 熟妇人妻无码xxx视频 | 中文字幕一区二区三区免费视频 | 99这里| 午夜一区二区三区四区 | 驯服少爷漫画免费观看下拉式漫画 | 黄色a毛片 | 日本在线有码 | 亚洲av片不卡无码久久 | 男女拍拍拍网站 | 我和公激情中文字幕 | 国产一区二区久久精品 | 久久久久二区 | 国产乱码一区二区三区播放 | 美女扒开尿口给男人看 | 精品毛片一区二区三区 | 黄色免费在线看 | 亚洲视频一二三 | 91老师片黄在线观看 | 国产三级视频网站 | 成av人片一区二区三区久久 | 亚洲日本视频 | 天天想你在线观看完整版电影高清 | 免费观看黄色网页 | 国产一区二区精品在线观看 | 视频黄色免费 | 日韩欧美福利 | 欧美高清久久 | 国产视频精品一区二区三区 | 日本h片在线观看 | 伊人久久五月 | 九九热这里有精品 | 国产日产欧美一区二区 | 久久久久国色av免费观看性色 | 欧美在线视频a | 超碰老司机 | 在线播放不卡 | 欧洲一区在线 | 欧美五月激情 | 日本成人在线一区 | 久久99久久99精品中文字幕 | 99情趣网 | 国精产品一区一区三区有限公司杨 | 日本一区二区三区在线播放 | 色婷婷av一区二区三区之e本道 |