青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

高級著色語言HLSL入門(1)

新建網頁 1

在我們寫的程序里頂點和像素是很小的對象,它們由GPU來執行,是固定功能管線的一部分。用我們自己寫的著色器程序替換一部分固定功能管線,在繪制效果上我們獲得很大的靈活性。我們不再局限于預定義的"固定"操作。

為了編寫著色器程序,我們需要一種高級著色器語言(High-Level Shading Language ,簡稱HLSL) 。 在DirectX 8中,著色器是用低級著色器匯編語言編寫的。幸運的是,我們不必再用匯編語言來寫著色器了,DirectX 9支持一種高級著色器語言來寫。用HLSL寫著色器程序與使用高級語言有同樣的優勢,像C++,它超越了匯編語言,即:

增加生產力用高級語言比用低級語言寫程序更快、更容易。 我們可以花費更多的時間關注于算法而不是代碼。

增加可讀性用高級語言寫的程序更易讀,這意味著用高級語言編程更易于調試和維護。

大多數情況下,編譯器產生的匯編代碼比手寫有效率。

使用HLSL 編譯器,我們可以編譯我們的代碼到任何可用shader版本,使用匯編語言我們將不得不為每個需要的版本移植代碼。

HLSL CC++語法很類似,所以縮短了學習曲線。

最后,如果你的顯卡不支持頂點和像素著色器的話,為了執行著色器的例子程序你將需要轉換REF設備。使用REF設備意味著著色器例子運行的會很慢,但它至少能顯示結果,讓我們去檢查是否代碼可以被執行。

提示:頂點shaders可以用軟件來模擬 ―― D3DCREATE_SOFTWARE_VERTEX-PROCESSING


16.1編寫HLSL 著色器

我們可以在程序源文件中用長字符串直接編寫HLSL著色器代碼,然而更方便、更模塊化的方法是把它與程序代碼分離出來。因此,我們在記事本中編寫著色器并保存成一般的ASCII文本文件,然后可以用D3DXCompileShaderFromFile函數(section 16.2.2)來編譯它們。

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

注意:這是一個頂點著色器的例子,不必關心頂點著色器做了什么,現在的目標是熟悉HLSL編程的語法和格式。

      /************************************************************************************
      Vertex shader that transforms a vertex by the view and projection transformation, 
      and sets the vertex color to red.
     ************************************************************************************/

   
   
    // Global variable to store a combined view and projection transformation matrix,
    // we initialize this variable from the application.
   
matrix g_view_proj_matrix;
   
   
    // initialize a global blue color vector
   
const vector RED = {1.0f, 0.0f, 0.0f, 1.0f};
   
   
    // Input structure describes the vertex that is input into the shader.
    // Here the input vertex contains a position component only.
   
struct sVertexInput
    {
        vector position : POSITION;
    };
   
   
    // Output structure describes the vertex that is output from the shader.
    // Here the output vertex contains a position and color component.
   
struct sVertexOutput
    {
        vector position : POSITION;
        vector diffuse  : COLOR;
    };
   
   
    // Main Entry point, observe the main function receives a copy of the input vertex through
    // its parameter and returns a copy of the output vertex it computes.
   
sVertexOutput main(sVertexInput input)
    {
        
// zero out members of output
   
        sVertexOutput output = (sVertexOutput)0;
   
        
// transform to view space and project
   
        output.position = mul(input.position, g_view_proj_matrix);
   
        
// set vertex diffuse color to blue
   
    output.diffuse = RED;
   
        
return output;
    }

16.1.1 全局變量

首先是2個全局變量:
// Global variable to store a combined view and projection transformation matrix.
// We initialize this variable from the application.
matrix g_view_proj_matrix;

// Initialize a global blue color vector.
const vector BLUE = {0.0f, 0.0f, 1.0f, 1.0f};

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

第二個變量BLUEbuilt-in(內建)類型的4D向量,我們簡單的將它初始化成藍色,它是個RGBA的顏色向量。

 

16.1.2 輸入和輸出結構

在全局變量定義之后,定義2個特殊的結構,我們調用輸入和輸出結構。對于頂點著色器而言,這些結構定義了頂點的數據,分別是:
// Input structure describes the vertex that is input into the shader.
// Here the input vertex contains a position component only.
struct sVertexInput
{
  vector position : POSITION;
};

// Output structure describes the vertex that is output from the shader.
// Here the output vertex contains a position and color component.
struct sVertexOutput
{
  vector position : POSITION;
  vector diffuse : COLOR;
};

 

注意:給像素著色器的結構定義輸入和輸出像素數據。

在例子中,INPUT 頂點著色器只包含位置成員(POSITION),OUTPUT頂點著色器包含位置和顏色成員POSITION and COLOR)。

特殊的冒號是一種語義,用于是聲明變量。這與vertex結構中的自由頂點格式(FVF)相似。例如,在sVertexInput中有成員:vector position : POSITION;

": COLOR"是說頂點的漫射光是用sVertexOutput結構的COLOR成員來說明的。
注意:從底層來說,著色器變量的語義和語法同硬件寄存器是相關聯的。即,input變量與input寄存器關聯,output變量與output寄存器關聯。例如,
sVertexInput中的position成員與頂點inputposition寄存器相關聯。同樣,diffuse與頂點的outputcolor寄存器關聯。

 

16.1.3 函數的入口點

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

// zero out members of output
sVertexOutput output = (sVertexOutput)0;

 

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

// transform to view space and project
output.position = mul(input.position, g_view_proj_matrix);


然后設置output的成員diffuse的顏色為色:

// set vertex diffuse color to red
output.diffuse = RED;

 

最后返回結果向量:

return output;
}

posted on 2008-04-05 15:58 lovedday 閱讀(9969) 評論(18)  編輯 收藏 引用

評論

# re: 高級著色語言HLSL入門(1)[未登錄] 2008-10-19 14:00 111

你他媽的天行健 我們他媽都掃地的哦
代碼不排版 注釋還是英文 例子也不給小載 還不標明哪來的  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-10-20 15:21 浩云

吃完人家的東西說人家弄得不好吃.
人家又不收你錢.
不好吃你可以不吃.
干嘛要罵人家.
你他媽的有人性嗎?  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-10-29 17:04 飄雪

那位說粗口的請注意你的素質.你表現出的行為不配進入這個圈子.
天兄能夠辛苦分享出來這么多資料,是值得尊敬的..
不懂英文,只能說明你的基礎不夠(我突然想到有部分人定義變量用的拼音),至于其他你所說的一些云云,笑談..大家權且當埋頭苦學時聞此人一聲狗吠.秋日一景!  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-11-01 08:39 看不慣那個傻插

理他干什么,他是讀書人嗎?根本不是!何必和一條野狗計較,直接刪貼。  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-11-05 11:01 B1樓

1樓的是個傻逼!!!大傻逼!!!  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-12-18 11:41 merrykid

有一個小錯誤,在下面一段中。
const vector BLUE和前面的源代碼不一樣。
前面的是RED。
-----------------------------------
16.1.1 全局變量首先是2個全局變量:
// Global variable to store a combined view and projection transformation matrix.
// We initialize this variable from the application.
matrix g_view_proj_matrix;

// Initialize a global blue color vector.
const vector BLUE = {0.0f, 0.0f, 1.0f, 1.0f};

第二個變量BLUE是built-in(內建)類型的4D向量,我們簡單的將它初始化成藍色,它是個RGBA的顏色向量。



  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-12-18 11:45 merrykid

請問一下,ARGB的順序是這樣嗎?我對HLSL知道的不多。
謝謝

  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2008-12-29 19:40 aq_1000

1樓,英文不行的話,我奉勸你先好好學學英文,或者直接放棄3D圖形編程吧,我現在也是硬著頭皮去學英文呢!  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2009-02-18 14:24 A_3D_CODER

same as 《Introduction to 3D Game Programming with DirectX 9.0》,
Just translating English to Chinese.
Thank you all the same.  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2009-02-22 16:41 lyra

1樓SX 連注釋那幾個單詞也懶得學 連學什么3D  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2009-04-29 14:00 553768913

支持天行健!!  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2009-06-15 18:19 anony

1樓
...
...
好比是我們在求知路上碰到的一坨屎  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2010-03-21 09:42 st

@111
你個白癡,人家辛辛苦苦寫了,你丫看不懂就罵,你是不是從山的那一邊來的?!

作者使用的英文不難,如果你認真查一下是可以輕易看懂的,至于代碼排版問題,并不影響對代碼意思的理解~

不說你了,說多了影響你那點牛逼的自尊,多提高一下自身素質吧!  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2010-11-17 20:16 1L你嗎

滾回你媽肚子里 天行健是你爺 你個太監  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2010-11-18 15:27 oppo

看了天兄的博文,不禁驚為天人,故特地申請了賬號來膜拜天兄。  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2011-05-10 22:00 Scorpion

就會抄書.這段話的出處于 <<Directx9.0 3D游戲開發編程基礎>>  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2011-05-12 16:04 耳朵

支持天行健!!!!狂頂  回復  更多評論   

# re: 高級著色語言HLSL入門(1) 2012-08-02 11:50 敗壞藝術

相當一些時候,傻逼埋怨正常人的智商太高,他當然不會覺得是自己的問題——因為是傻逼嘛。人是唯一會臉紅的動物,像一樓,是應該臉紅的。  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频中午一区| 欧美黑人国产人伦爽爽爽| 欧美激情一区二区三区不卡| 性色一区二区三区| 亚洲欧美日韩在线不卡| 欧美中文字幕视频| 老司机午夜精品视频在线观看| 狂野欧美一区| 欧美日韩国产综合视频在线观看| 欧美四级剧情无删版影片| 国产精品色网| 在线欧美亚洲| aa亚洲婷婷| 久久成人精品电影| 欧美黄网免费在线观看| 亚洲最黄网站| 久久av在线看| 欧美另类视频| 国产一区二区日韩精品| 亚洲人成7777| 欧美亚洲一区在线| 欧美激情四色| 亚洲一区影音先锋| 欧美国内亚洲| 国产午夜精品福利| 在线中文字幕一区| 免费观看在线综合色| 一本色道久久综合亚洲精品小说| 久久九九国产精品| 国产精品女人网站| 亚洲精品之草原avav久久| 久久黄色网页| 日韩视频免费观看| 蜜臀av性久久久久蜜臀aⅴ| 国产精品久久久久久久久搜平片 | 亚洲视频精选在线| 久久久www成人免费无遮挡大片| 欧美另类在线观看| 亚洲第一精品夜夜躁人人爽| 亚洲欧美日韩精品久久| 亚洲国产一区二区三区在线播| 一区二区三区视频在线观看| 久久综合给合久久狠狠色| 国产精品美女主播| 国产精品99久久久久久久久| 免费久久99精品国产| 亚洲欧美国产精品专区久久| 欧美久久电影| 亚洲国产日韩在线一区模特| 久久久久.com| 午夜精品免费视频| 国产精品久久国产精麻豆99网站| 亚洲精品日韩欧美| 免费久久99精品国产自| 久久精品日韩欧美| 免费看黄裸体一级大秀欧美| 午夜国产一区| 欧美日韩色一区| 亚洲精品日韩在线观看| 欧美激情精品久久久久久大尺度| 久久精品免视看| 国内一区二区三区在线视频| 久久国产色av| 欧美一区二区三区免费观看| 国产午夜精品麻豆| 久久久久久香蕉网| 久久久xxx| 亚洲第一页中文字幕| 欧美成人资源| 欧美成人自拍视频| av成人免费| 亚洲午夜国产一区99re久久| 国产精品视频观看| 久久蜜桃av一区精品变态类天堂| 久久aⅴ乱码一区二区三区| 在线观看中文字幕不卡| 亚洲第一伊人| 欧美日韩在线播放三区| 亚洲男人第一av网站| 欧美一区二粉嫩精品国产一线天| 国产亚洲激情视频在线| 蘑菇福利视频一区播放| 欧美二区在线观看| 亚洲欧美在线观看| 久久精品综合网| 一本久久a久久精品亚洲| 亚洲在线观看| 亚洲黄一区二区三区| 中文网丁香综合网| 在线成人中文字幕| 99re亚洲国产精品| 国精品一区二区三区| 亚洲国产一区二区三区青草影视| 欧美日韩三级一区二区| 久久久人成影片一区二区三区| 欧美高清在线精品一区| 欧美一区二区视频网站| 欧美电影美腿模特1979在线看| 亚洲免费影视| 狼人天天伊人久久| 亚洲一区二区三区777| 久久精品国产第一区二区三区最新章节 | 久久久久国产精品厨房| 免费在线亚洲欧美| 久久大综合网| 欧美日韩视频一区二区| 老司机精品视频网站| 欧美日韩在线观看视频| 免费在线看一区| 国产精品腿扒开做爽爽爽挤奶网站| 麻豆精品视频在线观看视频| 国产精品www| 最新日韩欧美| 影音先锋亚洲电影| 午夜精品理论片| 在线视频免费在线观看一区二区| 久久九九国产精品| 欧美国产视频日韩| 久久综合国产精品台湾中文娱乐网| 欧美日韩免费精品| 欧美激情1区| 一区二区三区无毛| 欧美中文日韩| 欧美中文字幕在线视频| 国产精品美女www爽爽爽| 亚洲精品之草原avav久久| 亚洲人永久免费| 另类图片国产| 欧美成人综合| 亚洲激情第一页| 老司机免费视频一区二区三区| 噜噜噜噜噜久久久久久91 | 久久成人在线| 久久久久青草大香线综合精品| 国产精品综合| 亚洲专区一区二区三区| 亚洲自拍偷拍一区| 国产精品极品美女粉嫩高清在线 | 久久综合色天天久久综合图片| 国产日韩欧美综合一区| 先锋影音久久| 久久一二三国产| 永久免费毛片在线播放不卡| 久久久xxx| 欧美激情视频网站| 亚洲美女在线观看| 欧美日韩专区在线| 亚洲午夜久久久久久久久电影院 | 欧美激情视频给我| av成人手机在线| 国产精品成人午夜| 亚洲影音一区| 久久这里有精品15一区二区三区| 韩国在线视频一区| 欧美电影在线观看完整版| 亚洲精品国产系列| 一区二区精品在线| 国产精品亚洲аv天堂网| 欧美一区二区黄色| 欧美韩日亚洲| 亚洲资源在线观看| 好吊日精品视频| 欧美1级日本1级| 亚洲一级片在线观看| 久久综合色婷婷| 一区二区免费看| 国产一二三精品| 欧美成人激情在线| 亚洲一二三区在线| 欧美成人久久| 亚洲欧美日韩第一区 | 性欧美18~19sex高清播放| 国产亚洲精品自拍| 欧美激情第3页| 亚洲欧美日韩另类| 亚洲国产导航| 欧美一区二区成人| 亚洲人成在线观看| 久久中文在线| 亚洲伦伦在线| 免费在线欧美视频| 欧美一区二区三区免费观看| 亚洲黄色在线| 国产又爽又黄的激情精品视频| 欧美日本韩国| 美女成人午夜| 久久国产精品久久久久久久久久 | 国产一区二区在线观看免费播放| 欧美成人首页| 久久精品一本| 亚洲欧美日韩在线观看a三区 | 久久九九免费视频| 制服丝袜激情欧洲亚洲| 亚洲国产成人porn| 蜜月aⅴ免费一区二区三区| 午夜精品视频网站| 亚洲天堂第二页| 99精品国产热久久91蜜凸| 在线电影国产精品| 伊人久久大香线蕉av超碰演员|