DirectX 11:模型不从Model类渲染

时间:2014-10-25 18:27:26

标签: c++ draw visual-studio-debugging directx-11

确定!开始。我已经更新了我的代码。但是,经过几个小时的调试看似完美的代码,我无法发现问题。我在Vertex和Index缓冲区创建以及类绘制调用周围设置了多个断点。

我已经为测试目的创建了一个临时vtest结构。它带有定义。

struct vtest{
    XMFLOAT3 Vertex;
    XMFLOAT4 Color;
};

链接到适当的IA抽象:

D3D11_INPUT_ELEMENT_DESC InputElementDesc[] = {
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },  
};

(所有这些都返回(HRESULT) S_OK

D3D11_BUFFER_DESC BufferDescription;
ZeroMemory(&BufferDescription, sizeof(BufferDescription));

BufferDescription.Usage = D3D11_USAGE_DYNAMIC;
BufferDescription.ByteWidth = sizeof(vtest) * sz_vBuffer;
BufferDescription.BindFlags = D3D11_BIND_VERTEX_BUFFER;
BufferDescription.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
BufferDescription.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA SRData;
ZeroMemory(&SRData, sizeof(SRData));
SRData.pSysMem = test;
SRData.SysMemPitch = 0;
SRData.SysMemSlicePitch = 0;

hr = Device->CreateBuffer(&BufferDescription, &SRData, &g_vBuffer);
D3D11_MAPPED_SUBRESOURCE MappedResource;
ZeroMemory(&MappedResource, sizeof(MappedResource));

vtest结构填充正确,并且:

DeviceContext->Map(g_vBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &MappedResource);

成功,同时使用(HRESULT) S_OK

如此初始化的指数:(一维DWORD指数数组。)

D3D11_BUFFER_DESC iBufferDescription;
ZeroMemory(&iBufferDescription, sizeof(iBufferDescription));

iBufferDescription.Usage = D3D11_USAGE_DEFAULT;
iBufferDescription.ByteWidth = sizeof(DWORD)*sz_iBuffer;
iBufferDescription.BindFlags = D3D11_BIND_INDEX_BUFFER;
iBufferDescription.CPUAccessFlags = NULL;
iBufferDescription.MiscFlags = 0;

D3D11_SUBRESOURCE_DATA iSRData;
iSRData.pSysMem = Indices;

hr = direct3D.Device->CreateBuffer(&iBufferDescription, &iSRData, &g_iBuffer);

IA Set...来电位于draw()来电:

DeviceContext->IASetVertexBuffers(0, 1, &g_vBuffer, &stride, &Offset);
DeviceContext->IASetIndexBuffer(g_iBuffer, DXGI_FORMAT_R32_UINT, 0);

其他设置:(编辑:更正值以显示配置。)

D3D11_RASTERIZER_DESC DrawStyleState;
DrawStyleState.AntialiasedLineEnable = false;
DrawStyleState.CullMode = D3D11_CULL_NONE;
DrawStyleState.DepthBias = 0;
DrawStyleState.FillMode = D3D11_FILL_SOLID;
DrawStyleState.DepthClipEnable = false;
DrawStyleState.MultisampleEnable = true;
DrawStyleState.FrontCounterClockwise = false;
DrawStyleState.ScissorEnable = false;

我的深度模板代码。

D3D11_TEXTURE2D_DESC DepthStenDescription;
ZeroMemory(&DepthStenDescription, sizeof(D3D11_TEXTURE2D_DESC));

DepthStenDescription.Width = cWidth;
DepthStenDescription.Height = cHeight;
DepthStenDescription.MipLevels = 0;
DepthStenDescription.ArraySize = 1;
DepthStenDescription.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
DepthStenDescription.SampleDesc.Count = 1;
DepthStenDescription.SampleDesc.Quality = 0;
DepthStenDescription.Usage = D3D11_USAGE_DEFAULT;
DepthStenDescription.BindFlags = D3D11_BIND_DEPTH_STENCIL;
DepthStenDescription.CPUAccessFlags = 0;
DepthStenDescription.MiscFlags = 0;

D3D11_DEPTH_STENCIL_VIEW_DESC DSVDesc;
ZeroMemory(&DSVDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
DSVDesc.Format = DSVDesc.Format;
DSVDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
DSVDesc.Texture2D.MipSlice = 0;

最后,我的实体类draw()方法:

void    Entity::Draw(){
    UINT stride = sizeof(vtest);
    UINT Offset = 0;

    ObjectSpace = XMMatrixIdentity();
    m_Scale = Scale();
    m_Rotation = Rotate();
    m_Translate = Translate();

    ObjectSpace = m_Scale*m_Rotation*m_Translate;
    mWVP = ObjectSpace*direct3D.mView*direct3D.mProjection;

    LocalWorld.mWorldVP = XMMatrixTranspose(wWVP);

    DeviceContext->UpdateSubresource(direct3D.MatrixBuffer, 0, NULL, &LocalWorld, 0, 0);
    DeviceContext->VSSetConstantBuffers(0, 1, &direct3D.MatrixBuffer);

    DeviceContext->IASetVertexBuffers(0, 1, &g_vBuffer, &stride, &Offset);
    DeviceContext->IASetIndexBuffer(g_iBuffer, DXGI_FORMAT_R32_UINT, 0);
    DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    DeviceContext->DrawIndexed(e_Asset.sz_Index, 0, 0);
}

代码编译,后备缓冲区正确显示,但没有模型。 Blank buffer

DirectX函数的初始化似乎也很好...... DirectX Debugger

更新根据Banex的建议,使用Visual Studio DirectX调试工具可以解决我在.hlsl文件中出错的问题。 Vertex Black Hole Shader of Division by Zero.

我想我也可能在着色器初始化时出错了,因为我的着色器非常简单,并且真正用作vert / pix传递文件:

1 个答案:

答案 0 :(得分:0)

检查.hlsl文件并进行进一步调试后;设置output.position = position;而不是乘以世界矩阵,模型被绘制在屏幕上,暗示一个糟糕的矩阵计算导致存储在常量缓冲区中的极端扭曲或空值。

cbuffer ConstantBuffer:register(b0)
{
    float4x4 WVP;
}

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;
    output.position = position;// mul(position, WVP);
    output.color = color;

    return output;
}


float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}