Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于没有法线数据的三角形网格,如何设置DirectX 9,使背面消隐处于禁用状态,z缓冲处于启用状态,而gouraud着色处于工作状态?_Directx_Zbuffer - Fatal编程技术网

对于没有法线数据的三角形网格,如何设置DirectX 9,使背面消隐处于禁用状态,z缓冲处于启用状态,而gouraud着色处于工作状态?

对于没有法线数据的三角形网格,如何设置DirectX 9,使背面消隐处于禁用状态,z缓冲处于启用状态,而gouraud着色处于工作状态?,directx,zbuffer,Directx,Zbuffer,我一直很难为PresentParameters和DirectX设备识别正确的参数,因此可以同时使用顶点级别的gouraud着色和z缓冲区。一些三角形网格工作正常,另一些三角形的背景三角形出现在靠近摄影机的三角形前面 这里有一个例子:。输入数据是面中顶点的简单列表。每个面中顶点的缠绕顺序是不确定的(来自各种CAD软件导出功能),并且没有法线数据 现在正在按如下方式设置PresentParameters。我意识到这是C++而不是C++,但我认为它足够有描述性,并且参数通过C++代码。这会产生图片中的

我一直很难为PresentParameters和DirectX设备识别正确的参数,因此可以同时使用顶点级别的gouraud着色和z缓冲区。一些三角形网格工作正常,另一些三角形的背景三角形出现在靠近摄影机的三角形前面

这里有一个例子:。输入数据是面中顶点的简单列表。每个面中顶点的缠绕顺序是不确定的(来自各种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)”)。正确的设置参数是什么

编辑:与DIGTX9接口的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控制面板中的debug spew以查看它是否告诉您错误是什么

Edit3:您已尝试将backbufferWidth和Height设置为0?backbuffercount设置为什么?也值得在backbuffer上尝试“Format.D24S8”吗?它“可能”你的图形卡不支持16位(虽然不太可能)。您是否已在caps中检查您尝试创建的模式是否有效?顺便说一句,我想您正在使用的CLR语言会自动设置未设置为0的参数?一、 就我个人而言,在这种情况下,我总是喜欢直言不讳

< P>我猜这里是因为我是本地C++ + DX9编码器,而不是CLR SLIMDX编码器… Edit4:我敢肯定是因为缺少窗口把手。。。我可能错了,但这是我唯一能看到你的设置有问题的地方。带窗口的DX9设备需要一个窗口。顺便说一句,将宽度和高度设置为0,以便只使用您正在设置设备大小的窗口


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

它在哪里返回无效呼叫

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

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

Edit3:您已尝试将backbufferWidth和Height设置为0?backbuffercount设置为什么?也值得在backbuffer上尝试“Format.D24S8”吗?它“可能”你的图形卡不支持16位(虽然不太可能)。您是否已在caps中检查您尝试创建的模式是否有效?顺便说一句,我想您正在使用的CLR语言会自动设置未设置为0的参数?一、 就我个人而言,在这种情况下,我总是喜欢直言不讳

< P>我猜这里是因为我是本地C++ + DX9编码器,而不是CLR SLIMDX编码器… Edit4:我敢肯定是因为缺少窗口把手。。。我可能错了,但这是我唯一能看到你的设置有问题的地方。带窗口的DX9设备需要一个窗口。顺便说一句,将宽度和高度设置为0,以便只使用您正在设置设备大小的窗口


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

我尝试过的PresentParameters的每一个其他配置,包括在结构中设置设备窗口句柄,都在创建EngineDX9对象时返回了无效调用。如果CreateDevice返回一个非成功代码,例如D3DERR_INVALIDCALL,则创建该对象的内部代码将抛出异常。我的问题是,对于我需要的三个特性,我无法判断哪个PresentParameters组合不会导致D3DERR_INVALIDCALL。是的,事实上,我已经打开了调试spew。它在D3DERR_INVALIDCALL hresult处中止,上面有该号码,没有进一步的信息。我真的不知道该怎么理解。我想问题是我没有像我应该说的那样明确。我将深入研究C++后台代码并编辑问题以发布其他参数。硬件是一个GeForce卡——大约有2年了。但是当我选择参考驱动程序而不是硬件时,结果是一样的。好吧,您看到的代码在http链接中生成了图片,看起来像是culling或zbuffering。对其进行更改将返回无效的调用hresult。我现在就试试你的Edit4推荐。谢谢你关于宽度和高度的建议。谢谢你的帮助。我想我遇到的是一个打z的问题。我将为此提出一个不同的问题。每一个其他配置的