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

隨筆 - 505  文章 - 1034  trackbacks - 0
<2007年12月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345


子曾經(jīng)曰過(guò):編程無(wú)他,唯手熟爾!

常用鏈接

留言簿(94)

隨筆分類(lèi)(649)

隨筆檔案(505)

相冊(cè)

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

積分與排名

  • 積分 - 921906
  • 排名 - 14

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

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

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

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

首先來(lái)根據(jù)下面這張圖粗略說(shuō)明一下當(dāng)前最普遍流行的AGP顯卡的渲染流程,甭管是nVidia還是ATI哪一邊的。

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

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

這樣你應(yīng)該想到Shader中大概應(yīng)該寫(xiě)些什么了。如果還不行的話(huà)建議復(fù)習(xí)一下D3D。用什么來(lái)寫(xiě)呢?
三。GPU自有GPU的指令集,以往的Shader就是用這種匯編式的指令集組成,例如:
vs_1_1

dcl_position v0

dcl_normal v1,r0, v0.x, c0

mad r2, v0.y, c1, r0

就如同匯編用多了必然出現(xiàn)C一樣,自Direct3D9.0后,一種叫HLSL(High Level Shading Language,高級(jí)渲染語(yǔ)言)的面向過(guò)程的Shader語(yǔ)言應(yīng)運(yùn)而生.

HLSL基礎(chǔ)

就像每一本編程語(yǔ)言的教材一樣,介紹一門(mén)語(yǔ)言,首先從它的數(shù)據(jù)類(lèi)型,表達(dá)式,控制流這些東西說(shuō)起。HLSL的這些基本語(yǔ)法很像C/C++,不再贅述。有些常見(jiàn)問(wèn)題還是要說(shuō)明一下,是為了讓你不會(huì)被這些牽制了全面了解Shader的腳步。

數(shù)據(jù)類(lèi)型

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

反映到程序上,一個(gè)四維向量就被聲明為float4,4維方矩陣被聲明為float4x4等等。當(dāng)然,你也可以使用任意不超過(guò)4的維度的向量或矩陣,如int3,float3x3,double1。這個(gè)double1實(shí)際上就是標(biāo)量了,1可以省略不寫(xiě)。

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

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

Semantic & Annotation

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

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

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

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

函數(shù)

HLSL中提供了很多函數(shù)可供調(diào)用,在Direct3D 文檔 -> DirectX Graphics -> Reference -> HLSL Shader Reference -> HLSL Intrinsic Functions中有這些函數(shù)的詳細(xì)列表。也可自己寫(xiě)函數(shù)用,但是在較早的Shader版本中,就像內(nèi)聯(lián)函數(shù)一樣編譯時(shí)最終要將函數(shù)展開(kāi)插入到函數(shù)調(diào)用處。還有一點(diǎn)我想你一定會(huì)想到的就是主函數(shù)會(huì)是什么。Vertex Shader和Pixel Shader各自需要一個(gè)主函數(shù),由程序員來(lái)指定!沒(méi)錯(cuò),程序員在Shader外部指定。

posted on 2007-11-13 01:08 七星重劍 閱讀(2113) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Game Graphics 、HLSL&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>
            99精品视频免费观看| 亚洲午夜视频| 国产精品国产三级国产专区53 | 久久久久国产精品一区三寸| 亚洲欧美中日韩| 亚洲欧美国产日韩天堂区| 亚洲一区二区视频在线| 先锋影音久久| 免费看黄裸体一级大秀欧美| 亚洲国产mv| 亚洲精品一级| 性欧美大战久久久久久久久| 久久免费视频一区| 欧美日韩国产综合久久| 国产精品亚洲综合久久| 影音先锋日韩有码| 中文有码久久| 久久综合国产精品台湾中文娱乐网| 亚洲国产成人高清精品| 一本在线高清不卡dvd| 久久国产精品第一页| 欧美黑人多人双交| 国产一级一区二区| 夜夜爽av福利精品导航| 久久精品日产第一区二区| 亚洲二区在线视频| 午夜精品在线| 欧美日韩国产一中文字不卡| 狠狠色丁香久久婷婷综合_中| 夜夜爽www精品| 毛片一区二区三区| 亚洲欧美日韩在线综合| 欧美激情欧美激情在线五月| 国产一区二区精品久久91| 一区二区三区四区精品| 欧美成人精品不卡视频在线观看| 亚洲一区日韩| 欧美理论大片| 亚洲国产欧美一区二区三区久久| 欧美在线免费| 宅男精品导航| 欧美区视频在线观看| 在线观看日韩专区| 久久av一区二区| 亚洲午夜在线观看视频在线| 亚洲美女色禁图| 男人插女人欧美| 国产精品毛片在线看| 亚洲国产精品第一区二区三区| 亚洲一区二区三区四区五区午夜 | 99国产精品久久久久老师| 久久久999精品| 亚洲在线免费| 国产精品美女久久福利网站| 一区二区三区视频在线| 亚洲精品一级| 欧美日韩精品是欧美日韩精品| 亚洲国产小视频| 亚洲成色最大综合在线| 裸体女人亚洲精品一区| 在线免费高清一区二区三区| 裸体丰满少妇做受久久99精品| 欧美一区亚洲| 狠狠操狠狠色综合网| 久久亚洲精品网站| 久久久久久久久一区二区| 怡红院精品视频| 亚洲大片在线观看| 欧美国产日韩精品| 一本色道久久综合亚洲精品按摩| 亚洲精品国产品国语在线app| 欧美激情导航| 在线亚洲国产精品网站| 亚洲无线一线二线三线区别av| 国产精品啊啊啊| 欧美在线网站| 麻豆精品传媒视频| 亚洲天堂av在线免费观看| 亚洲影院色在线观看免费| 狠狠色狠狠色综合系列| 午夜日韩在线| 欧美日韩免费网站| 欧美亚洲日本一区| 欧美一级欧美一级在线播放| 激情欧美一区二区三区| 亚洲国产天堂久久综合| 欧美日韩一区自拍| 久久久不卡网国产精品一区| 你懂的成人av| 亚洲欧美日韩国产成人精品影院| 午夜精品福利一区二区蜜股av| 精品1区2区3区4区| 亚洲国产精品成人一区二区| 欧美性一区二区| 美女黄网久久| 国产精品jizz在线观看美国 | 伊人男人综合视频网| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美亚洲视频一区二区| 久久久久**毛片大全| 宅男精品视频| 久久九九免费视频| 亚洲视频1区2区| 久久精品国产免费看久久精品| 亚洲精品中文在线| 午夜精品在线视频| 一本久久a久久免费精品不卡| 亚洲欧美卡通另类91av| 亚洲日本在线视频观看| 亚洲午夜精品久久久久久app| 在线观看一区视频| 亚洲网站视频| 亚洲美女中出| 欧美1区2区3区| 久久精品二区| 欧美日韩亚洲天堂| 欧美韩日一区二区三区| 国产色产综合色产在线视频| 亚洲国产清纯| 1024国产精品| 欧美一区=区| 久久精品二区三区| 国产精品成人午夜| 亚洲精品久久久久| 亚洲国产精品一区二区www| 亚洲综合精品| 亚洲一区亚洲二区| 欧美片在线观看| 亚洲国产网站| 亚洲精选视频在线| 免费观看成人网| 欧美成人精品在线观看| 韩日欧美一区| 久久久久久91香蕉国产| 久久躁狠狠躁夜夜爽| 黑丝一区二区三区| 午夜精品免费| 先锋影音一区二区三区| 欧美日韩国产一区| 亚洲免费观看高清完整版在线观看熊 | 伊人久久成人| 久久五月激情| 免费在线看成人av| 一区二区三区在线观看视频| 午夜精品福利在线| 欧美在线观看视频一区二区三区| 国产精品私房写真福利视频| 亚洲色图自拍| 欧美一区二区免费观在线| 国产精品免费视频xxxx| 麻豆9191精品国产| 久久免费偷拍视频| 国语自产精品视频在线看一大j8 | 性欧美videos另类喷潮| 久久精品一区二区三区不卡| 国产偷久久久精品专区| 欧美一级淫片播放口| 久久综合国产精品台湾中文娱乐网| 好看的日韩av电影| 老司机免费视频一区二区三区| 久久中文欧美| 亚洲大胆美女视频| 欧美激情第4页| 亚洲视频欧美视频| 久久久人人人| 亚洲精品女人| 国产精品视频xxx| 久久精品夜色噜噜亚洲aⅴ| 免费亚洲一区| 亚洲视频导航| 国产亚洲精品久久久| 免费91麻豆精品国产自产在线观看| 亚洲激情偷拍| 久久国产精彩视频| 亚洲三级视频| 国产精品亚洲综合| 免费的成人av| 亚洲欧美成人综合| 亚洲高清视频一区二区| 亚洲性视频h| 亚洲国产cao| 国产精品无码专区在线观看| 久久视频精品在线| 亚洲小视频在线| 亚洲成人在线视频网站| 小黄鸭精品密入口导航| 亚洲二区精品| 国产揄拍国内精品对白| 欧美精品午夜| 久久久亚洲国产天美传媒修理工 | 亚洲午夜成aⅴ人片| 免费观看日韩| 午夜日韩福利| 99视频在线精品国自产拍免费观看| 国产农村妇女毛片精品久久麻豆| 国产精品igao视频网网址不卡日韩| 亚洲精品在线免费观看视频| 久久久av水蜜桃| 日韩亚洲国产精品| 好吊视频一区二区三区四区|