我正在尝试创建一个简单的漫反射着色器来绘制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设置不同的渲染状态,但没有成功。
答案 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 );