我一直难以确定 PresentParameters 和 DirectX 设备的正确参数,因此可以同时使用顶点级 gouraud 着色和使用 az 缓冲区。一些三角形网格工作正常,其他的背景三角形出现在靠近相机的三角形前面。
在这里可以找到一个示例:http: //gallery.me.com/robert.perkins/100045/zBufferGone。输入数据是构面中顶点的简单列表。每个面的顶点的缠绕顺序是不确定的(来自各种 CAD 软件导出功能)并且没有法线数据。
现在正在按如下方式设置 PresentParameters。我意识到这是 C# 而不是 C++,但我认为它足够具有描述性,并且参数传递给 C++ 代码。这会产生图片中的图像;参考设备上的行为相同:
pParams = new PresentParameters()
{
BackBufferWidth = this.ClientSize.Width,
BackBufferHeight = this.ClientSize.Height,
AutoDepthStencilFormat = Format.D16,
EnableAutoDepthStencil = true,
SwapEffect = SwapEffect.Discard,
Windowed = true
};
_engineDX9 = new EngineDX9(this, SlimDX.Direct3D9.DeviceType.Hardware, SlimDX.Direct3D9.CreateFlags.SoftwareVertexProcessing, pParams);
_engineDX9.DefaultCamera.NearPlane = 0;
_engineDX9.DefaultCamera.FarPlane = 10;
_engineDX9.D3DDevice.SetRenderState(RenderState.Ambient, false);
_engineDX9.D3DDevice.SetRenderState(RenderState.ZEnable, ZBufferType.UseZBuffer);
_engineDX9.D3DDevice.SetRenderState(RenderState.ZWriteEnable, true);
_engineDX9.D3DDevice.SetRenderState(RenderState.ZFunc, Compare.Always);
_engineDX9.BackColor = Color.White;
_engineDX9.FillMode = FillMode.Solid;
_engineDX9.CullMode = Cull.None;
_engineDX9.DefaultCamera.AspectRatio = (float)this.Width / this.Height;
我的所有其他设置尝试,即使在参考设备上,也会返回 COM 错误代码({“D3DERR_INVALIDCALL:无效调用 (-2005530516)”})。正确的设置参数是什么?
编辑:与 DirectX9 接口的 C++ 类设置默认值如下:
PresentParameters::PresentParameters()
{
BackBufferWidth = 640;
BackBufferHeight = 480;
BackBufferFormat = Format::X8R8G8B8;
BackBufferCount = 1;
Multisample = MultisampleType::None;
MultisampleQuality = 0;
SwapEffect = SlimDX::Direct3D9::SwapEffect::Discard;
DeviceWindowHandle = IntPtr::Zero;
Windowed = true;
EnableAutoDepthStencil = true;
AutoDepthStencilFormat = Format::D24X8;
PresentFlags = SlimDX::Direct3D9::PresentFlags::None;
FullScreenRefreshRateInHertz = 0;
PresentationInterval = PresentInterval::Immediate;
}