2014-03-30 10 views
0

我想創建一個簡單的漫反射着色器來繪製DirectX 9中的原始對象並面臨以下問題。當我使用像Torus或Teapot這樣的DirectX原始對象時,網格的前景部分中的某些面不可見。我不認爲這是面部不可見的同樣的事情,因爲我不能重現像Sphere或Box這樣的原始對象沒有兩個四邊形具有相同法線的這種行爲。以下是填充和線框模式下的一些截圖。 torus fill-mode在DirectX中使用漫反射着色器時,背景面在同一網格中的前景面上可見

以下是我的頂點減速代碼。

// vertex position... 
D3DVERTEXELEMENT9 element; 
element.Stream = 0; 
element.Offset = 0; 
element.Type = D3DDECLTYPE_FLOAT3; 
element.Method = D3DDECLMETHOD_DEFAULT; 
element.Usage = D3DDECLUSAGE_POSITION; 
element.UsageIndex = 0; 
m_vertexElement.push_back(element); 

// vertex normal 
element.Stream = 0; 
element.Offset = 12; //3 floats * 4 bytes per float 
element.Type = D3DDECLTYPE_FLOAT3; 
element.Method = D3DDECLMETHOD_DEFAULT; 
element.Usage = D3DDECLUSAGE_NORMAL; 
element.UsageIndex = 0; 
m_vertexElement.push_back(element); 

開發中的着色器代碼。

float4x4 MatWorld : register(c0);  
float4x4 MatViewProj : register(c4); 
float4 matColor : register(c0); 

struct VS_INPUT 
{ 
float4 Position : POSITION; 
float3 Normal : NORMAL; 
}; 

struct VS_OUTPUT 
{ 
float4 Position : POSITION; 
float3 Normal : TEXCOORD0; 
}; 

struct PS_OUTPUT 
{ 
float4 Color : COLOR0; 
}; 

VS_OUTPUT vsmain(in VS_INPUT In) 
{ 
    VS_OUTPUT Out; 

float4 wpos = mul(In.Position, MatWorld); 

Out.Position = mul(wpos, MatViewProj); 
Out.Normal = normalize(mul(In.Normal, MatWorld)); 

return Out; 
}; 

PS_OUTPUT psmain(in VS_OUTPUT In) 
{ 
PS_OUTPUT Out; 
float4 ambient = {0.1, 0.0, 0.0, 1.0}; 
float3 light = {1, 0, 0}; 
Out.Color = ambient + matColor * saturate(dot(light, In.Normal)); 

return Out; 
}; 

我也嘗試過爲Depth-Stencil設置不同的渲染狀態,但沒有成功。

project files

+0

有趣的是,是否可以粘貼所有的代碼或下載項目? – zdd

+0

@zdd,我通過編輯原始問題添加了項目文件的鏈接。不得不刪除一些以前的鏈接,因爲我沒有足夠的聲望來保留所有的鏈接:( – Manga

+0

這是一個z緩衝區問題,請參閱我的答案。 – zdd

回答

0

我知道了!這是一個深度緩衝區(Z-Buffer)問題,您可以通過固定管線或着色器在您的代碼中啓用Z-Buffer。

要啓用Z緩衝固定管道:

首先創建D3D deivce時

d3dpp.EnableAutoDepthStencil = TRUE ; 
d3dpp.AutoDepthStencilFormat = D3DFMT_D16 ; 

然後再繪製

device->SetRenderState(D3DRS_ZENABLE, TRUE) ; 

最後之前啓用Z緩衝中添加如下代碼,清晰的z緩衝區渲染功能

device->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); 
+0

謝謝zdd。這是有效的。你能告訴我你是如何設法這個出來了,你有一些調試工具還是純粹的經驗? – Manga

+0

不,我只是懷疑,然後添加z緩衝區代碼,它的工作原理。 – zdd