將就看吧,有些單詞我實(shí)在不知道怎么翻譯,只可意會(huì)!
像素著色器需要依靠寄存器來(lái)取得頂點(diǎn)數(shù)據(jù),輸出像素?cái)?shù)據(jù),取得計(jì)算時(shí)的臨時(shí)結(jié)果和關(guān)聯(lián)紋理采樣通道(stage)。有幾種類型的寄存器,每一種都有特殊的功能和用途。
像素著色器需要的用到的數(shù)據(jù)由寄存器保管,下面是寄器存的所有介紹
寄存器類型:描述了四種可用的寄存器和他們各自的用途
讀取端口限制:?jiǎn)沃羔樖褂枚鄠€(gè)寄存器時(shí)的限制
R/RW: 描述了哪些寄存器可以用來(lái)讀,寫或是讀寫。
范圍:各個(gè)分量的范圍的詳細(xì)說(shuō)明
Register Types
Versions
Name Type 1_1 1_2 1_3 1_4
c# Constant register 8 8 8 8
r# Temporary register 2 2 2 6
t# Texture register 4 4 4 6
v# Color register 2 2 2 2 in phase 2
1,常量寄存器:常量寄存器容納了常量數(shù)據(jù)。數(shù)據(jù)可以用IDirect3DDevice9::SetPixelShaderConstantF函數(shù)將一個(gè)常量裝入常量寄存器中。也可以用def-ps來(lái)定義一個(gè)常量。 常量寄存器對(duì)紋理尋址指令來(lái)說(shuō)是不可用的,唯一例外的是texm3x3spec-ps指令,這個(gè)指令使用一個(gè)常量寄存器來(lái)提供一個(gè)視線向量(eye-ray vector)
2,臨時(shí)寄存器:臨時(shí)寄存器用來(lái)存立即結(jié)果。r0用來(lái)作為PS的最終輸出。shader的最后時(shí)刻r0中存放的是最后的像素顏色值
如果任何的著色器試圖從一個(gè)沒有被寫入數(shù)據(jù)的臨時(shí)寄存器中讀取數(shù)據(jù)時(shí),著色器激IDirect3DDevice9::CreatePixelShader將會(huì)失?。╯hader validation will fail)。假設(shè)激活(validation)是可用狀態(tài)D3DXAssembleShader函數(shù)調(diào)用也會(huì)因?yàn)橄嗤脑蚨 #ú灰褂肈3DXSHADER_SKIPVALIDATION)
紋理寄存器:
在ps 1_1 到1_3中,紋理寄存器容納紋理數(shù)據(jù)或是紋理坐標(biāo)。當(dāng)一個(gè)紋理被采樣時(shí),紋理數(shù)據(jù)便被裝載到一個(gè)紋理寄存器中。
當(dāng)紋理通道狀態(tài)屬性被登記的時(shí)候紋理采樣使用紋理坐標(biāo)來(lái)查詢(look up)或采樣(sample)一個(gè)紋理坐標(biāo)(u,v,w,q)標(biāo)記的顏色值。紋理坐標(biāo)數(shù)據(jù)會(huì)根據(jù)頂點(diǎn)紋理坐標(biāo)數(shù)據(jù)進(jìn)行插值,并關(guān)聯(lián)到相關(guān)的紋理通道。紋理通道號(hào)與紋理坐標(biāo)聲明序列有一個(gè)一一對(duì)應(yīng)關(guān)系。默認(rèn)情況下,頂點(diǎn)格式中定義的第一個(gè)紋理坐標(biāo)與紋理通道0關(guān)聯(lián)。
在這些版本的像素著色器中,當(dāng)紋理寄存器用來(lái)做算術(shù)運(yùn)算的時(shí)候就和臨時(shí)寄存器的效果一樣了。
在ps_1_4中,紋理寄存器(t#)容納的是只讀紋理坐標(biāo)信息。這意味著紋理坐標(biāo)集和紋理通道編號(hào)是獨(dú)立的。紋理通道編號(hào)由目的寄存器(r0 to r5)決定。對(duì)于texld指令來(lái)說(shuō),紋理坐標(biāo)集由源寄存器t0 to t5決定。因此紋理坐標(biāo)集可以映射到任何的紋理通道上。另外,對(duì)于texld的源寄存器(指定紋理坐標(biāo)信息)也可以是臨時(shí)寄存器(r#)。在這樣的情況下,臨時(shí)寄存器記錄紋理坐標(biāo)。
顏色寄存器容納了每個(gè)像素的顏色值,這個(gè)值通過(guò)頂點(diǎn)數(shù)據(jù)中的漫反射和鏡面光顏色值迭代而來(lái)。對(duì)于ps_1_4。顏色寄存器只有在phase2中可用。如果著色模式設(shè)置為D3DSHADE_FLAT,那么頂點(diǎn)顏色中的顏色迭代將不可用。如果霧化開啟的話,那么渲染管線還是會(huì)忽略著色模式,對(duì)霧進(jìn)行顏色迭代。記住霧化比像素著色器后應(yīng)用。
通常我們會(huì)從v0加載頂點(diǎn)漫反射顏色數(shù)據(jù)。從v1加載頂點(diǎn)鏡面光顏色數(shù)據(jù)。
輸入顏色數(shù)據(jù)值將會(huì)被規(guī)范到0和1,因?yàn)檫@是像素著色器中的顏色寄存器的有效范圍
像素著色器對(duì)顏色寄存器進(jìn)行只讀操作。顏色寄存器中存放的是迭代值,但是迭代可能會(huì)造成比紋理坐標(biāo)低很多精度