Directx Direct3D11,模型的某些部分总是在其他部分之前,可能是关于深度

Directx Direct3D11,模型的某些部分总是在其他部分之前,可能是关于深度,directx,direct3d11,d3dx,Directx,Direct3d11,D3dx,我是一个新的D3D程序员 当我试图渲染一个模型时,我遇到了一个奇怪的问题 你可以看到图片,模型的某些部分总是在其他部分之前 模型顶点仅包含以下数据 { float x, y, z; float r, g, b; float u, v; } 我试着用opengl和webgl()来渲染它,效果很好。但在D3D11中,我遇到了一个奇怪的问题 我尝试了谷歌,找到了一些关于深度的东西,但我不知道如何处理它 以下是我的代码的一部分: HLSL文件 struct vout { float4 pos

我是一个新的D3D程序员

当我试图渲染一个模型时,我遇到了一个奇怪的问题

你可以看到图片,模型的某些部分总是在其他部分之前

模型顶点仅包含以下数据

{
float x, y, z;
float r, g, b;
float u, v;
}
我试着用opengl和webgl()来渲染它,效果很好。但在D3D11中,我遇到了一个奇怪的问题

我尝试了谷歌,找到了一些关于深度的东西,但我不知道如何处理它

以下是我的代码的一部分:

HLSL文件

struct vout
{
    float4 position : SV_POSITION;
    float3 normal : NORMAL;
    float2 texcoord : TEXCOORD;
};

vout vshader(float3 position : POSITION, float3 normals : NORMAL, float2 texcoords : TEXCOORD)
{
    vout output;

    output.position = float4(position, 1);
    output.normal = normals ;
    output.texcoord = texcoords;

    return output;
}

Texture2D shaderTexture;
SamplerState SampleType;
float3 pshader(float3 position : POSITION, float3 normals  : NORMAL, float2 texcoords : TEXCOORD) : SV_TARGET
{
    return shaderTexture.Sample(SampleType, texcoords);
}
顶点结构

struct lol_skn_vertex {
    float position[3];
    char bone_index[4]; // for bones and animation, not used here
    float bone_weights[4]; // for bones and animation, not used here
    float normals[3];
    float texcoords[2];
};
输入布局对象

D3D11_INPUT_ELEMENT_DESC ied[] =
{
    {"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0,  0, D3D11_INPUT_PER_VERTEX_DATA, 0},
    {"NORMAL",   0, DXGI_FORMAT_R32G32_FLOAT, 0, 32, D3D11_INPUT_PER_VERTEX_DATA, 0},
    {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 44, D3D11_INPUT_PER_VERTEX_DATA, 0},
};
渲染功能

void RenderFrame(void)
{
    FLOAT ColorRGBA[4] = {0.0f, 0.2f, 0.4f, 1.0f};

    d3d11_device_context->ClearRenderTargetView(d3d11_view_rt_backbuffer, ColorRGBA);
    d3d11_device_context->ClearDepthStencilView(d3d11_view_ds,D3D11_CLEAR_DEPTH|D3D11_CLEAR_STENCIL,1.f,0); 

    update();

    UINT stride = sizeof(lol_skn_vertex);
    UINT offset = 0;

    d3d11_device_context->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset);
    d3d11_device_context->IASetIndexBuffer(index_buffer, DXGI_FORMAT_R16_UINT, 0);
    d3d11_device_context->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    d3d11_device_context->DrawIndexed(skn.num_indices, 0, 0);
    // switch the back buffer and the front buffer
    dxgi_swapchain->Present(0, 0);
}
缓冲区更新功能

void update() {

    // copy the vertices into the buffer
    D3D11_MAPPED_SUBRESOURCE ms;
    d3d11_device_context->Map(vertex_buffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);    // map the buffer
    memcpy(ms.pData, skn_vertex_buffer, sizeof(lol_skn_vertex) * skn.num_vertices);                 // copy the data
                                        // unmap the buffer

    SYSTEMTIME SystemTime;
    GetSystemTime(&SystemTime);

    float angle = (float)SystemTime.wMilliseconds/1000+SystemTime.wSecond;

    D3DXMATRIX x;
    D3DXMatrixRotationY(&x, angle);
    D3DXVec4TransformArray((D3DXVECTOR4 *)ms.pData, sizeof(lol_skn_vertex), (D3DXVECTOR4 *)ms.pData, sizeof(lol_skn_vertex), &x, skn.num_vertices);
    // use D3DXVECTOR4 for Transform

    d3d11_device_context->Unmap(vertex_buffer, NULL);  
}

最后我解决了这个问题

我犯了两个非常愚蠢的错误

第一:在“输入布局对象”中,我使用DXGI_格式_R32G32_浮点表示位置,它只包含x和y。因此着色器在z上始终为0

第二:我的模型数据没有标准化,范围从-50到50,所以我使用D3D11_光栅化器_DESC来禁用DepthClip,但我忘记了它

解决这两个问题,一切正常。
非常感谢Gnietschow:)

您是否确保使用启用Z缓冲的DepthStencilState?你创建了一个DepthStencilSurface吗?也许这个链接有帮助:谢谢你的回复,但是我仍然对“深度,模具”和“z”的概念有点困惑。在d3d9中,我需要做的是SetRenderState(D3DRS_ZENABLE,TRUE),然后如何使用Z缓冲创建DepthStencilState?感谢阅读链接,这里有完整的创作说明。如果链接太难的话,网上有很多例子或教程。你这边稍微努力一下就好了。再次感谢,事实上我已经阅读了链接。如果我理解正确,我需要做的是将DepthEnable配置为true,DepthFunc配置为D3D11_COMPARISON_LESS,StencilEnable配置为false(这意味着使用z进行剪辑,但在我的代码中似乎不起作用)。是这样吗?如果是这样,至少我的方向是正确的。你能用新的代码更新你的问题吗?drawcall和设置会很有趣。