disablez缓冲无法使用directxtk

disable z buffering is not working using directxtk

本文关键字:directxtk 缓冲 disablez      更新时间:2023-10-16

我试图禁用和启用z缓冲区,但skydome仍然向zbuffer写入。我使用DirectXTK是为了这个目的,但它似乎可能不起作用。

    CommonStates states(m_Graphics.getDevice());
    m_Graphics.getContext()->RSSetState(states.CullNone());
    XMMATRIX sphereWorld;
    XMMATRIX sphereScale = XMMatrixScaling(200.0f, 200.0f, 200.0f);
    XMMATRIX Translation = XMMatrixTranslation(m_Camera.Position().x, 
        m_Camera.Position().y, m_Camera.Position().z);
    sphereWorld = sphereScale*Translation;
    m_Graphics.getContext()->OMSetDepthStencilState(states.DepthNone(), 1);
    m_shape->Draw(sphereWorld,m_Camera.ViewMatrix(), m_Camera.ProjectionMatrix(), Colors::White, m_texture.Get());
    m_Graphics.getContext()->OMSetDepthStencilState(states.DepthDefault(),1);
    XMMATRIX cameraInverse = XMMatrixInverse(nullptr, m_Graphics.getViewMatrix());
    XMMATRIX translate = XMMatrixTranslation( 2.0f, -3.0f, 2.0f);
    XMMATRIX rotation = XMMatrixRotationRollPitchYaw((float)XM_PI/9.0f, (float)XM_PI/0.2f, (float)XM_PI/0.1f);
    XMMATRIX world = rotation *translate *cameraInverse;
    m_Tiny->Draw(m_Graphics.getContext(), states, world, m_Graphics.getViewMatrix(), m_Graphics.getProjectionMatrix());
    m_Graphics.getContext()->RSSetState(states.CullCounterClockwise());
    m_Graphics.getContext()->RSSetState(states.Wireframe());
    m_Grid.DrawGrid();

GeometricPrimitiveModel都在内部设置所需的渲染状态,包括作为其API一部分的深度/模具状态。

对于GeometricPrimitive,可以使用setCustomState回调来覆盖默认状态设置。例如,这里有一个使用lambda:的例子

m_shape->Draw(sphereWorld,m_Camera.ViewMatrix(), m_Camera.ProjectionMatrix(),
Colors::White, m_texture.Get(), false, [=]
{
    m_Graphics.getContext()->RSSetState(states.CullNone());
    m_Graphics.getContext()->OMSetDepthStencilState(states.DepthNone(), 1);
});

对于"模型",可以在Draw方法上使用相同的setCustomState回调进行快速调整,也可以仅实现"高级绘图"模式。请参阅wiki