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

隨筆 - 505  文章 - 1034  trackbacks - 0
<2007年8月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678


子曾經曰過:編程無他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(649)

隨筆檔案(505)

相冊

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 918557
  • 排名 - 14

最新隨筆

最新評論

閱讀排行榜

評論排行榜

original address: http://www.aougu.net/html/70/n-1170.html 

寫過Direct3D程序的朋友們可能還記得,在以往,大家常為如何表現更多真實的材質(如玻璃、金屬等)而發愁。最新的Direct3D中,HLSL把程序員從復雜的Shader指令集中解放出來,著力于更重要的算法。
首先,什么是Shader&什么是HLSL?

簡要地說,Shader就是一種腳本程序,相對獨立于D3D主程序,并且被編譯成顯卡的GPU指令序列在顯示芯片上跑。(你肯定想知道更多,比如這種程序用什么來寫,都要寫什么,怎么讓GPU跑這種程序等等,別著急慢慢來),這里有必要先了解一下:
AGP顯卡的渲染流程:

首先來根據下面這張圖粗略說明一下當前最普遍流行的AGP顯卡的渲染流程,甭管是nVidia還是ATI哪一邊的。

每次渲染過程(例如,在一幀畫面中畫一個饅頭的過程)都包括頂點處理(Vertex Processing)和像素處理(Pixel Processing)兩個主要功能模塊的執行。首先,顯卡從AGP總線接收這個饅頭的頂點數據。這些數據包括位置、法線、貼圖坐標(如果是面包可能更需要貼圖,也就是說貼圖坐標不是必需的)等等,這些都是未經過任何變換,也就是在物體本地空間(Object Space)下的原始坐標。每個頂點依次被送入頂點處理單元,在這里進行坐標變換、光照計算(如果是每頂點光照)等工作,變換的結果是把每個三角形變換置屏幕空間(Screen Space)下直接可用。這里用到的變換矩陣、燈光等信息都是處理每一批頂點時一次性傳給顯卡的,作為顯卡的資源。頂點處理圈定了三角形的范圍,接下來就要逐像素地填充這個三角形了。填充哪些像素是靠對頂點屏幕坐標的線性插值來決定的。像素的其他一些必要參數,如顏色,貼圖坐標等也是通過對上一步計算出來的頂點的這些屬性進行插值得到的。另外每個像素還要通過深度檢測和模板檢測決定最終是否繪制。需要繪制的像素被送進像素處理模塊,進行貼圖像素取值,貼圖混合等工作,必要的話每像素光照也在這里完成。這里貼圖等信息也是作為顯卡的資源。像素最終的處理結果被放進后備緩沖。

以往顯卡在頂點處理和像素處理過程中執行的是一套布在硬件上的固定的程序,D3D程序員只能設置一些參數,實際上就是你調用 IDirect3DDevice::SetRenderState()時做的事,而這樣的程序在IDirect3DDevice:: DrawPrimitive()中自動執行。那么有些事情就很難辦到,如渲染一個水晶饅頭。應為參數再多,其渲染所用到的光照公式也跑不出石膏這種東西。現在的顯卡,確切的說是現在的Direct3D允許你寫這么一段程序替代固定的頂點處理過程和像素處理過程(記住,只是這兩個過程,跟插值什么的沒關系)。其中替換頂點處理的就叫Vertex Shader(暫時還沒有確切的中文名),替換像素處理的就叫Pixel Shader。就是開篇所說的Shader。

這樣你應該想到Shader中大概應該寫些什么了。如果還不行的話建議復習一下D3D。用什么來寫呢?
三。GPU自有GPU的指令集,以往的Shader就是用這種匯編式的指令集組成,例如:
vs_1_1

dcl_position v0

dcl_normal v1,r0, v0.x, c0

mad r2, v0.y, c1, r0

就如同匯編用多了必然出現C一樣,自Direct3D9.0后,一種叫HLSL(High Level Shading Language,高級渲染語言)的面向過程的Shader語言應運而生.

HLSL基礎

就像每一本編程語言的教材一樣,介紹一門語言,首先從它的數據類型,表達式,控制流這些東西說起。HLSL的這些基本語法很像C/C++,不再贅述。有些常見問題還是要說明一下,是為了讓你不會被這些牽制了全面了解Shader的腳步。

數據類型

與CPU不同,在顯卡芯片中,最小的數據吞吐單元是一個由32位浮點數組成的四元組。這一點很有道理不是,想想你在渲染過程中所有涉及到的數據,最復雜的不外乎四維坐標(x,y,z,w)或顏色(r,g,b,a),這樣GPU可以一次性處理一個四元組。而整數什么的在顯卡中被放到四元組的一個分量里使用,而很多顯卡中,整數、布爾值都不被直接支持,而是轉為浮點數使用。至于矩陣,通常用4個四元組表示一個4x4矩陣(默認情況一個四元組存儲一行,也可以指定按列存儲)其他尺寸的以此類推。

反映到程序上,一個四維向量就被聲明為float4,4維方矩陣被聲明為float4x4等等。當然,你也可以使用任意不超過4的維度的向量或矩陣,如int3,float3x3,double1。這個double1實際上就是標量了,1可以省略不寫。

紋理(Texture)&取樣器(Sampler)

這倆東西可以看作特殊類型變量。紋理就是Shader中用到的貼圖資源,這我想沒什么好說的。來解釋一下取樣器:實際上每張貼圖在使用的時候都要用一個取樣器。取樣器相當于這樣一個結構,除了保存貼圖本身數據之外,還包括過濾參數等取樣信息。通常,讀取貼圖這樣的指令接收的都是取樣器類型的參數而并非直接接收紋理貼圖。聲明及使用紋理或取樣器跟使用普通變量一樣。這里有一些初始化取樣器的方法,還是等到后面的實例中講述吧。

Semantic & Annotation

任何類型的變量(包括紋理和取樣器),我們都可以用Semantic或Annotation修飾來起到一些特殊作用。Semantic暫時翻譯成語義; Annotation暫時翻譯成注解,這是HLSL中獨特的東西。下面這兩行中,第一個變量冒號后面的POSITION就是Semantic,第二個變量后面用一對尖括號<>圈起來的表達式就是Annotation,一組<>中可以有很多個表達式。
float3 OmniPos : POSITION;
texture TexMap 
< string name = "test.dds">;

一般來講,Semantic告訴應用程序或D3D這個被修飾的變量是做什么用的,Annotation告訴程序這個變量怎么用。很云山霧罩是嗎,是這樣,在應用程序代碼中,是可以調用D3D的API認出Semantic和Annotation的。例如上面這兩行,程序的邏輯就可能是這樣:首先寫主程序的甲和寫Shader的乙約定好POSITION標識該變量代表燈泡A的位置,甲在程序里寫:{燈泡A.位置 = XXX; 找到Shader中帶POSITION的變量; 給該變量賦值為燈泡A.位置; return;} 那么甲可以不知道乙在Shader中給這個要用燈泡A位置的變量起了什么名,而且乙可以在好幾個Shader中給用這個數據的變量起不同的名。然后,甲和乙再約定遇到Annotation中的“name”就將后面的字符串作為文件名建立貼圖。于是甲的程序就從Shader中讀出了一個文件名,建立了一個貼圖以供這個texture變量使用。Semantic和Annotation大概就這么用,首先要約定好各個Semantic和Annotation都是什么意思,這是up to you的,然后就是通過它們的標識來給變量賦值或作其他輔助性工作了。

既然都是做輔助說明的為什么還要分成Semantic和Annotation,我的想法是Semantic簡單方便而Annotation能干的事更多。不說這個了,無關大局。要說的是,D3D也跟我們約定了一套Semantic,它們大體上都能顧名思義,控制流

控制流,就是if…else,for,while什么的。在CPU中,這些控制流造成的實際上是指令跳轉。但在GPU中指令跳轉并不被廣泛的支持,以往的大部分顯卡只懂得按順序一句一句執行指令。因此HLSL的編譯器可能會做出諸如展開循環、遍歷分支等等莽撞的事來適應顯卡。所以使用時要特別小心,而且不是所有情況的控制流語句都被支持。

函數

HLSL中提供了很多函數可供調用,在Direct3D 文檔 -> DirectX Graphics -> Reference -> HLSL Shader Reference -> HLSL Intrinsic Functions中有這些函數的詳細列表。也可自己寫函數用,但是在較早的Shader版本中,就像內聯函數一樣編譯時最終要將函數展開插入到函數調用處。還有一點我想你一定會想到的就是主函數會是什么。Vertex Shader和Pixel Shader各自需要一個主函數,由程序員來指定!沒錯,程序員在Shader外部指定。

posted on 2007-11-13 01:08 七星重劍 閱讀(2110) 評論(0)  編輯 收藏 引用 所屬分類: Game GraphicsHLSL&ShaderMonkey
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品国产精品| 免费亚洲一区| 中文国产成人精品| 欧美亚男人的天堂| 欧美一区二区三区在线免费观看 | 精品粉嫩aⅴ一区二区三区四区| 久久久999精品免费| 久久99伊人| 亚洲激情影院| 亚洲精品国久久99热| 欧美日韩国产综合久久| 亚洲欧洲99久久| 久久精品夜色噜噜亚洲aⅴ| 亚洲乱亚洲高清| 亚洲欧美韩国| 亚洲国产精品尤物yw在线观看| 91久久一区二区| 国产美女精品一区二区三区| 久久久久国色av免费看影院 | 野花国产精品入口| 国模精品娜娜一二三区| 亚洲二区精品| 国产精品入口| 亚洲盗摄视频| 国产欧美一二三区| 亚洲欧洲日产国产综合网| 国产精品久久九九| 亚洲国产成人在线| 国产欧美一区二区精品秋霞影院 | 蜜臀91精品一区二区三区| 欧美日韩成人一区二区| 久久中文字幕一区| 国产精品免费一区二区三区在线观看 | 久久青草福利网站| 亚欧成人在线| 欧美久久久久久蜜桃| 久久久久久亚洲精品不卡4k岛国| 欧美日韩国产综合一区二区| 久久综合色8888| 国产精品亚洲综合久久| 亚洲激情中文1区| 在线视频成人| 久久av红桃一区二区小说| 亚洲欧美国产视频| 欧美另类69精品久久久久9999| 美日韩精品视频| 国产一区自拍视频| 亚洲影音先锋| 亚洲永久免费视频| 欧美日韩国产在线播放| 欧美激情一二三区| 亚洲福利免费| 免费的成人av| 欧美成人精品一区| 亚洲伦理中文字幕| 美女黄毛**国产精品啪啪| 亚欧成人在线| 国产麻豆精品theporn| 99热在这里有精品免费| 一本色道久久加勒比88综合| 欧美国产国产综合| 亚洲国产国产亚洲一二三| 亚洲激情视频在线播放| 久久亚裔精品欧美| 欧美国产精品va在线观看| 亚洲国产成人porn| 你懂的成人av| 亚洲七七久久综合桃花剧情介绍| 日韩天堂在线观看| 欧美三级视频在线播放| 一本色道久久综合狠狠躁篇的优点 | 久久久精品久久久久| 国产在线播放一区二区三区| 欧美一区三区二区在线观看| 久久久久国产一区二区| 国产一区二区三区四区老人 | 欧美激情一区二区三区不卡| 最新国产成人av网站网址麻豆| 欧美国产成人在线| 亚洲最新合集| 欧美专区在线播放| 在线观看欧美精品| 欧美日韩国产在线| 午夜亚洲视频| 欧美激情亚洲视频| 亚洲一区视频| 黄色日韩网站| 欧美精品v国产精品v日韩精品 | 亚洲国产mv| 亚洲综合精品| 在线观看国产一区二区| 欧美日韩在线高清| 欧美一区二区三区免费观看视频| 美女脱光内衣内裤视频久久影院 | 亚洲欧洲偷拍精品| 欧美在线一二三| 亚洲片在线资源| 国产精品自拍一区| 欧美高清不卡| 欧美一区二区三区在线观看视频 | 亚洲视频免费在线观看| 蜜臀久久99精品久久久久久9| 99精品欧美一区二区蜜桃免费| 国产精品视频免费在线观看| 裸体一区二区三区| 亚洲免费在线视频| 亚洲六月丁香色婷婷综合久久| 久久国产一区二区| 一区二区欧美国产| 欧美国产日韩视频| 欧美成人午夜激情在线| 亚洲永久在线观看| 亚洲人成高清| 狠狠色丁香婷婷综合久久片| 欧美三级日本三级少妇99| 久久久五月婷婷| 亚洲欧美精品伊人久久| 亚洲精品专区| 欧美激情性爽国产精品17p| 久久精品亚洲乱码伦伦中文| 在线视频欧美精品| 日韩视频免费看| 亚洲成人资源| 悠悠资源网久久精品| 国产亚洲成精品久久| 国产精品免费网站| 欧美视频一区二区三区…| 男女视频一区二区| 狼人天天伊人久久| 久久亚洲国产精品一区二区| 欧美一区二区三区久久精品| 亚洲视频免费在线观看| 99视频精品全国免费| 亚洲精品影院在线观看| 亚洲激情网站免费观看| 欧美激情aⅴ一区二区三区 | 亚洲国产日韩在线一区模特| 国产一区二三区| 国产在线高清精品| 国内精品一区二区三区| 国产日韩欧美黄色| 国产亚洲欧美另类中文| 国产香蕉97碰碰久久人人| 国产伦精品一区二区三区在线观看| 欧美视频不卡| 国产精品久久久久一区| 国产精品日韩二区| 国产视频亚洲精品| 国模 一区 二区 三区| 国产性色一区二区| 在线观看的日韩av| 亚洲麻豆一区| 亚洲五月六月| 久久激情综合网| 裸体素人女欧美日韩| 欧美成人午夜视频| 亚洲欧洲日本国产| 亚洲午夜在线| 久久爱www| 欧美大片免费观看| 欧美日韩在线视频一区| 国产精品一二一区| 在线日韩视频| 亚洲视频一区二区| 久久丁香综合五月国产三级网站| 久久网站免费| 日韩午夜精品| 欧美在线观看你懂的| 免费观看成人www动漫视频| 欧美人交a欧美精品| 国产精品在线看| 亚洲国产另类久久精品| 亚洲亚洲精品在线观看| 久久亚洲欧美| 亚洲免费av电影| 久久国内精品自在自线400部| 欧美高清一区| 国产亚洲精品资源在线26u| 亚洲日本激情| 欧美一区三区三区高中清蜜桃| 欧美www视频在线观看| 一区二区三区国产精品| 久久中文字幕导航| 国产精品普通话对白| 亚洲国产成人精品视频| 亚洲综合三区| 亚洲福利视频专区| 久久电影一区| 国产精品美女久久久久久2018| 亚洲高清在线观看一区| 欧美一区二区三区免费大片| 久久精品国产欧美激情| 久久久亚洲人| 91久久国产综合久久91精品网站| av成人免费在线| 国产亚洲人成a一在线v站| 亚洲精品视频在线观看免费| 久久精品视频一| 亚洲视频一区二区在线观看| 欧美高清免费|