我想創建一個簡單的漫反射着色器來繪製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設置不同的渲染狀態,但沒有成功。
有趣的是,是否可以粘貼所有的代碼或下載項目? – zdd
@zdd,我通過編輯原始問題添加了項目文件的鏈接。不得不刪除一些以前的鏈接,因爲我沒有足夠的聲望來保留所有的鏈接:( – Manga
這是一個z緩衝區問題,請參閱我的答案。 – zdd