C++ Z缓冲区导致东西无法绘制

C++ Z缓冲区导致东西无法绘制,c++,directx-9,C++,Directx 9,我在DirectX9中绘制东西时遇到一些问题 下面是我的渲染函数: void Render(GameWorld& world) { DWORD BackgroundColour = 0x00102010; g_pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, BackgroundColour, 1.0f, 0); // Begin rendering the scen

我在DirectX9中绘制东西时遇到一些问题

下面是我的渲染函数:

void Render(GameWorld& world)
{
    DWORD BackgroundColour = 0x00102010;    

    g_pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, BackgroundColour, 1.0f, 0);

    // Begin rendering the scene.
    if (SUCCEEDED(g_pd3dDevice -> BeginScene()))
    {
        world.draw();

        g_pd3dDevice -> EndScene();
    }

    // Present the backbuffer to the display.
    g_pd3dDevice -> Present(NULL, NULL, NULL, NULL);
}
我正在使用以下代码设置DirectX:

// Create the D3D object, return failure if this can't be done.
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL;

// Set up the structure used to create the D3DDevice
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

// Create the D3DDevice
if (FAILED(g_pD3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &g_pd3dDevice)))
{
    return E_FAIL;
}

// Turn on the Z buffer
g_pd3dDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
g_pd3dDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE);

// Start with lighting off - we can add lights later.
g_pd3dDevice -> SetRenderState(D3DRS_LIGHTING, FALSE);

// Set transparencies
g_pd3dDevice -> SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
g_pd3dDevice -> SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
g_pd3dDevice -> SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
g_pd3dDevice -> SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);




// Set culling
g_pd3dDevice -> SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);

return S_OK;
实际上,这画了一个背景色屏幕,上面什么也没有

通过关闭Z缓冲区[例如,gpd3ddevidence->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);]按照调用“绘制”函数的顺序绘制所有内容。以后绘制的对象会遮挡以前绘制的对象

我也尝试过做这些改变:

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_GREATER);

现在的效果是,首先绘制的对象会遮挡稍后绘制的对象,而不管其空间位置如何

我想要的效果是使近的对象模糊远的对象

有人能解释一下吗


谢谢。

尝试删除以下行:

g_pd3dDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
g_pd3dDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
默认情况下,z缓冲区处于启用状态,因此它应该可以工作。
确保通过正确的WorldView投影矩阵变换对象。

如果未渲染对象,请检查是否调用了World.draw()。也许BeginScene()会失败?

解决这个问题的最简单方法是使用PIX,您可能已经在SDK中安装了它。通过PIX调试,这是一个蛋糕步(从内存开始):您将在PIX中启动程序,点击F12,然后关闭应用程序以分析帧。选择第一个绘制调用,单击“网格”选项卡,此时您将能够调查设备。在抽签调用前后查看附加的Z目标。将设备与Z缓冲区一起研究将非常快地缩小范围,并让您了解发生了什么。当我在PIX中运行程序时,它返回到不绘制任何内容,并且无法加载任何纹理。不应该,如果直接启动可执行文件,会发生什么?不是从内部VS。我从来没有弄清楚这一点,但我确实发现了一个解决方法:以前我设置DirectX使用右手投影。(x从左向右运行,y向前和向后运行,z向上和向下运行)因此,一般来说,z值越高的物体离相机越近。(尽管我相信z缓冲区与此无关,所以…)无论如何-通过切换到左手投影并反转所有z值,它现在可以工作。
g_pd3dDevice -> SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);

g_pd3dDevice -> SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS);
g_pd3dDevice -> SetRenderState(D3DRS_ZWRITEENABLE, TRUE);