在DirectX中使用漫反射着色器时,背景面在同一网格中的前景面上可见

时间:2014-03-30 05:29:18

标签: c++ directx shader directx-9

我正在尝试创建一个简单的漫反射着色器来绘制DirectX 9中的原始对象并面临以下问题。当我使用像Torus或Teapot这样的DirectX原始对象时,网格的前景部分中的一些面是不可见的。我不认为这与面孔不可见是一回事,因为我不能为像Sphere或Box这样的原始对象重现这种行为,其中没有两个四边形具有相同的法线。以下是填充和线框模式下的一些屏幕截图。 torus fill-mode

以下是我的顶点减速代码。

// 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

1 个答案:

答案 0 :(得分:0)

我明白了!这是深度缓冲区(Z-Buffer)问题,您可以通过固定管道或着色器在代码中启用Z-Buffer。

在固定管道中启用z-buffer:

首先在创建D3D deivce时添加以下代码

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

然后在绘制之前启用z-buffer

device->SetRenderState(D3DRS_ZENABLE, TRUE) ;

最后,在渲染函数中清除z-buffer

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