1

我一直难以确定 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;
}
4

1 回答 1

1

它在哪里返回无效调用?

编辑:我假设在新的 EngineDX9 调用中?您是否尝试在当前参数中设置设备窗口句柄?

编辑 2:您是否打开了 DirectX 控制面板中的 debug spew 以查看它是否告诉您错误是什么?

Edit3:您尝试将 backbufferWidth 和 Height 设置为 0?backbuffercount 设置为多少?可能还值得在后台缓冲区上尝试“Format.D24S8”?您的显卡“可能”不支持 16 位(虽然不太可能)。您是否检查了您尝试创建的模式有效的上限?顺便说一句,我假设您使用的 CLR 语言会自动将您未设置的参数设置为 0?在这种情况下,我个人总是更喜欢明确表达....

PS我在这里猜测是因为我是本地 C++ DX9 编码器而不是 CLR SlimDX 编码器......

Edit4:我确定它缺少窗口句柄......我可能错了,但那是我唯一能看到你的设置真的错了。带窗口的 DX9 设备需要一个窗口。顺便说一句,将宽度和高度设置为 0 以仅使用您正在设置设备大小的窗口...

编辑5:我真的在这里走错了路。创建产生“不正确”设备的设备没有任何问题。不要乱用目前的参数,它们很好。Z-Buffering 出现问题的主要原因是您将比较功能设置为始终。这意味着,无论 z 缓冲区包含什么,传递像素并将其 z 写入 z 缓冲区,覆盖已经存在的任何内容。我敢打赌你的Z缓冲问题。

于 2010-01-17T18:59:45.163 回答