我如何设置的DirectX 9,使背面剔除处于关闭状态,Z缓冲是,和高洛德着色的作品,为三角形网格没有法线数据?
题
我一直有识别正确的参数为PresentParameters和DirectX装置,所以,可以有顶点级高洛德着色和使用Z缓冲器的两个难度。一些三角形网格的工作正常,其他有出现在三角形其是近到照相机的前面背景三角形。
这方面的一个例子是在这里找到: 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;
}
解决方案
如果它返回一个无效电话?
编辑:我假设在新EngineDX9电话吗?您已经尝试在本参数设定装置窗口句柄?
编辑2:你有没有打开调试喷涌在DirectX控制面板,查看是否它会告诉你是什么错误
EDIT3:试图backbufferWidth和高度设置为0?什么是backbuffercount设置?也可能是值得尝试“Format.D24S8”的后备缓冲?它“可能”你的显卡不支持16位(尽管可能性不大)。你有没有在你所要创建的模式是有效的帽子检查?我asssume,顺便说一句,您所使用的自动的CLR语言设置你不要设置为0的参数?我本人总是倾向于是在这种情况下显式....
PS我猜这里是因为我是个原生C ++ DX9编码器不是一个CLR SlimDX编码器...
Edit4:我敢肯定它缺乏窗口句柄的...我可能是错的,但是,这是我可以看到真的错了您的设置的唯一的事情。一个窗口DX9设备需要的窗口。顺便说一句设置宽度和高度为0,只使用窗口要设置的设备太的大小...
编辑5:我真的在这里标题下了错误的路线。没有什么错的创作所产生的“不正确”设备的设备。做他们都很好,本参数不乱。你必须与你的Z缓冲问题的主要原因是,你设置的比较功能始终。这意味着,无论什么样的Z缓冲包含,PAS像素,写它的Z到Z缓冲区改写无论是已经存在。我打赌这其中就有你的Z缓冲问题。