GPU中的ps 1.x 寄存器
將就看吧,有些單詞我實在不知道怎么翻譯,只可意會!
像素著色器需要依靠寄存器來取得頂點數(shù)據(jù),輸出像素數(shù)據(jù),取得計算時的臨時結(jié)果和關(guān)聯(lián)紋理采樣通道(stage)。有幾種類型的寄存器,每一種都有特殊的功能和用途。
像素著色器需要的用到的數(shù)據(jù)由寄存器保管,下面是寄器存的所有介紹
寄存器類型:描述了四種可用的寄存器和他們各自的用途
讀取端口限制:單指針使用多個寄存器時的限制
R/RW: 描述了哪些寄存器可以用來讀,寫或是讀寫。
范圍:各個分量的范圍的詳細說明
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ù)將一個常量裝入常量寄存器中。也可以用def-ps來定義一個常量。 常量寄存器對紋理尋址指令來說是不可用的,唯一例外的是texm3x3spec-ps指令,這個指令使用一個常量寄存器來提供一個視線向量(eye-ray vector)
2,臨時寄存器:臨時寄存器用來存立即結(jié)果。r0用來作為PS的最終輸出。shader的最后時刻r0中存放的是最后的像素顏色值
如果任何的著色器試圖從一個沒有被寫入數(shù)據(jù)的臨時寄存器中讀取數(shù)據(jù)時,著色器激IDirect3DDevice9::CreatePixelShader將會失敗(shader validation will fail)。假設(shè)激活(validation)是可用狀態(tài)D3DXAssembleShader函數(shù)調(diào)用也會因為相同的原因而失敗。(不要使用D3DXSHADER_SKIPVALIDATION)
紋理寄存器:
在ps 1_1 到1_3中,紋理寄存器容納紋理數(shù)據(jù)或是紋理坐標。當一個紋理被采樣時,紋理數(shù)據(jù)便被裝載到一個紋理寄存器中。
當紋理通道狀態(tài)屬性被登記的時候紋理采樣使用紋理坐標來查詢(look up)或采樣(sample)一個紋理坐標(u,v,w,q)標記的顏色值。紋理坐標數(shù)據(jù)會根據(jù)頂點紋理坐標數(shù)據(jù)進行插值,并關(guān)聯(lián)到相關(guān)的紋理通道。紋理通道號與紋理坐標聲明序列有一個一一對應(yīng)關(guān)系。默認情況下,頂點格式中定義的第一個紋理坐標與紋理通道0關(guān)聯(lián)。
在這些版本的像素著色器中,當紋理寄存器用來做算術(shù)運算的時候就和臨時寄存器的效果一樣了。
在ps_1_4中,紋理寄存器(t#)容納的是只讀紋理坐標信息。這意味著紋理坐標集和紋理通道編號是獨立的。紋理通道編號由目的寄存器(r0 to r5)決定。對于texld指令來說,紋理坐標集由源寄存器t0 to t5決定。因此紋理坐標集可以映射到任何的紋理通道上。另外,對于texld的源寄存器(指定紋理坐標信息)也可以是臨時寄存器(r#)。在這樣的情況下,臨時寄存器記錄紋理坐標。
顏色寄存器容納了每個像素的顏色值,這個值通過頂點數(shù)據(jù)中的漫反射和鏡面光顏色值迭代而來。對于ps_1_4。顏色寄存器只有在phase2中可用。如果著色模式設(shè)置為D3DSHADE_FLAT,那么頂點顏色中的顏色迭代將不可用。如果霧化開啟的話,那么渲染管線還是會忽略著色模式,對霧進行顏色迭代。記住霧化比像素著色器后應(yīng)用。
通常我們會從v0加載頂點漫反射顏色數(shù)據(jù)。從v1加載頂點鏡面光顏色數(shù)據(jù)。
輸入顏色數(shù)據(jù)值將會被規(guī)范到0和1,因為這是像素著色器中的顏色寄存器的有效范圍
像素著色器對顏色寄存器進行只讀操作。顏色寄存器中存放的是迭代值,但是迭代可能會造成比紋理坐標低很多精度
posted on 2009-09-12 13:36 麒麟子 閱讀(2473) 評論(5) 編輯 收藏 引用 所屬分類: GPU and Graphic