我一直很难为PresentParameters和DirectX设备识别正确的参数,因此既可以使用顶点级别的gouraud,也可以使用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: Invalid call (-2005530516)"})。正确的设置参数是什么?
EDIT:与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;
}发布于 2010-01-18 02:59:45
它在哪里返回一个无效的调用?
编辑:我假设在新的EngineDX9调用中?您是否尝试过在当前参数中设置设备窗口句柄?
编辑2:您是否打开了DirectX控制面板中的debug spew,看看它是否会告诉您错误是什么?
Edit3:您是否已尝试将backbufferWidth和Height设置为0?backbuffercount设置为什么?在后台缓冲区上尝试"Format.D24S8“可能也是值得的?它的“可能”你的显卡不支持16位(虽然不太可能)。您是否检查了caps以确定您尝试创建的模式是有效的?顺便说一句,你正在使用的CLR语言会自动设置你没有设置为0的参数吗?就我个人而言,在这种情况下,我总是倾向于直言不讳……
我在这里猜测是因为我是一个本地的C++ DX9程序员,而不是一个CLR SlimDX程序员…
Edit4:我敢肯定是缺少窗口句柄的原因……我可能错了,但这是我唯一能看到你的设置真正错误的地方。有窗口的DX9设备需要窗口。顺便说一句,将宽度和高度设置为0可仅使用您正在设置设备大小的窗口...
编辑5:我真的走错了路。产生您的“不正确”设备的设备的创建没有任何错误。不要弄乱当前的参数,它们很好。Z-Buffering出现问题的主要原因是您将比较函数设置为always。这意味着,无论z-buffer包含什么内容,都要传递像素并将其z写入z-buffer,覆盖已经存在的内容。我打赌这就是你的Z缓冲问题。
https://stackoverflow.com/questions/2082065
复制相似问题