3d遊戲中,很多東西都需要以2d的形式展現,比如人物的狀態列,物品欄等,那麼如何才能在3d場景中放置它們呢?我在這裡介紹一種通過簡化變換過程而實現的方法.
大家知道,乙個模型頂點在顯示到螢幕上,一共要經過4次變換,分別是世界變換,攝象機變換,投影變換以及視口變換.在世界變換中,我們通過乙個仿射矩陣把這個頂點放置到世界的相應位置;在攝象機變換中,我們以攝象機作為原點把頂點放置到相應位置;而在投影變換中,若我們選擇z = 1作為投影面,我們相當於把z = z的平面上的點對映到了z = 1上,比如點( x, y, z, z )就投影為( x / z, y / z, 1 );最後,我們又利用視口變換,把這個點對映到螢幕象素座標上,如( 0, 0 )對映為( screenx / 2, screeny / 2 ).
我說了這麼多,無非就是想告訴大家,我們在把頂點傳遞後,會經過前三次變換對映到( -1, -1, 0 )以及( 1, 1, 1 )的立方體內( 視口變換暫時不去考慮 ),也就是說d3d的近截面從0開始.
一張前景圖,必然是遮擋所有3d實體與環境的東東,那麼我們就可以知道在三次變換後的頂點的座標設為( x, y , 0 ),注意-1例如:我定義:
//前景圖的四個頂點以及相應索引
vertex v1( d3dxvector3( 0, 0, 0 ), d3dxvector2( 0 ,1 ) );
vertex v2( d3dxvector3( 0, 0.6, 0 ), d3dxvector2( 0 ,0 ) );
vertex v3( d3dxvector3( 0.4, 0, 0 ), d3dxvector2( 1 ,1 ) );
vertex v4( d3dxvector3( 0.4, 0.6, 0 ), d3dxvector2( 1 ,0 ) );
那麼如果不進行前三次變換,這個矩形的就會直接被對映到螢幕上變成乙個正方形,為什麼是正方形呢?這是因為如果在800*600的解析度下,必須設定水平與垂直縮放值,他們的比值為4 : 3.
本方法經測試有效,似乎在d3d中還有一種方法是通過把頂點位置宣告設定為已變換,但是我想既然其他3d實體的頂點都需要進行變換的洗禮,那我還是如鄉隨俗吧...
在shader中,可以直接如下:
void vs(float3 pos : position, float4 color : color, float3 normal : normal, float2 texcoord : texcoord0,
out float4 oposition : position, out float4 ocolor : color, out float2 otexcoord : texcoord0,
out float ofogexponent : texcoord1 )
{oposition =float4( pos, 1 ); //直接使用,不需要變換
//oposition = mul( float4( pos, 1 ), matworldviewproj );
float4 p = mul( float4( pos, 1 ), matworld );
float3 no = normalize( mul( normal, matworld ) );
computefogexponent( p.xyz, eyepos.xyz, ofogexponent );
ocolor = float4( 1, 0, 0, 1 );
otexcoord = texcoord;
D3D基本框架 即D3D標頭檔案分類
了dxut的結構 後,發現微軟程式設計師的編碼風格太深奧了。各種巨集定義 預編譯跳得頭暈,由於對於window api的不精通,導致寫出符合dxut風格的框架以現在的水平來看是不可能的。既然沒有弄通dxut,我也暫時不想套用了,那麼還是先自己用自己的框架來寫把。框架如下 雖然沒學會dxut,但是微軟...
d3d矩陣變換
1.d3d的繪製流水線 區域性座標系 模型空間 世界座標系 觀察座標系 背面消隱 光照 裁剪 投影 視口變化 光柵化 每個3d模型都有自己的空間,空間的中心 原點 就是模型的中心。世界空間就是物體 模型 存在的地方。世界的中心就是原點 0,0,0 注意螢幕中間的那一點不是世界空間的中心點,螢幕中間的...
d3d矩陣總結
d3d中實現物件的基本渲染需要使用shader指令碼,而shader指令碼最低的的需求就是頂點與矩陣,在這裡主要討論矩陣 這個矩陣是3個矩陣運算得來的,分別是世界矩陣 視矩陣和投影矩陣 世界矩陣 世界矩陣就是標識者物體在世界座標系中的位置,預設下設為單位陣即可 視矩陣 視矩陣是攝像機位置和朝向的設定...