DirectX:屏幕上没有任何内容

时间:2013-03-12 17:58:46

标签: c++ debugging directx

我正在尝试使用DirectX(10)开发一个程序来在屏幕上显示。

事情是,它只显示我用来清除后缓冲的颜色。

(我为随后的大量代码道歉。)

这是我的渲染功能:

void DXEngine::renderOneFrame()
{
    //First, we clear the back buffer
    m_device->ClearRenderTargetView(m_renderTargetView,D3DXCOLOR(0.0f, 0.125f, 0.3f, 1.0f));

    //Then, we clear the depth buffer
    m_device->ClearDepthStencilView(m_depthStencilView,D3D10_CLEAR_DEPTH,1.0f, 0);

    //Update variables
    m_worldVariable->SetMatrix((float*)&m_world);
    m_viewVariable->SetMatrix((float*)&m_view);
    m_projectionVariable->SetMatrix((float*)&m_projection);

    //Render the cube 
    D3D10_TECHNIQUE_DESC techDesc;
    m_technique->GetDesc(&techDesc);

    for(UINT pass = 0; pass < techDesc.Passes ; pass++){

        m_technique->GetPassByIndex(pass)->Apply(0);
        m_device->DrawIndexed(36,0,0);
    }

    m_swapChain->Present(0,0);
}

它与DirectX SDK中的DirectX10的第5个教程(2010年6月)在“Samples”文件夹下完全相同,只是它封装在一个对象中。

我的场景初始化如下:

HRESULT DXEngine::initStaticScene()
{
    HRESULT hr;

    //Vertex buffer creation and initialization
    Vertex1Pos1Col vertices [] = 
    {
        { D3DXVECTOR3( -1.0f, 1.0f, -1.0f ), D3DXVECTOR4( 0.0f, 0.0f, 1.0f, 1.0f ) },
        { D3DXVECTOR3( 1.0f, 1.0f, -1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 0.0f, 1.0f ) },
        { D3DXVECTOR3( 1.0f, 1.0f, 1.0f ), D3DXVECTOR4( 0.0f, 1.0f, 1.0f, 1.0f ) },
        { D3DXVECTOR3( -1.0f, 1.0f, 1.0f ), D3DXVECTOR4( 1.0f, 0.0f, 0.0f, 1.0f ) },
        { D3DXVECTOR3( -1.0f, -1.0f, -1.0f ), D3DXVECTOR4( 1.0f, 0.0f, 1.0f, 1.0f ) },
        { D3DXVECTOR3( 1.0f, -1.0f, -1.0f ), D3DXVECTOR4( 1.0f, 1.0f, 0.0f, 1.0f ) },
        { D3DXVECTOR3( 1.0f, -1.0f, 1.0f ), D3DXVECTOR4( 1.0f, 1.0f, 1.0f, 1.0f ) },
        { D3DXVECTOR3( -1.0f, -1.0f, 1.0f ), D3DXVECTOR4( 0.0f, 0.0f, 0.0f, 1.0f ) },
    };


    D3D10_BUFFER_DESC desc;
    desc.Usage = D3D10_USAGE_DEFAULT;
    desc.ByteWidth = sizeof(Vertex1Pos1Col) * 8;
    desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = 0;

    D3D10_SUBRESOURCE_DATA data;
    data.pSysMem = vertices;
    hr = m_device->CreateBuffer(&desc,&data,&m_vertexBuffer);

    if(FAILED(hr)){
        MessageBox(NULL,TEXT("Vertex buffer creation failed"), TEXT("Error"),MB_OK);
        return hr;
    }

    UINT stride = sizeof(Vertex1Pos1Col);
    UINT offset = 0;
    m_device->IASetVertexBuffers(0,1,&m_vertexBuffer,&stride,&offset);

    //Index buffer creation and initialization
    DWORD indices[] = 
    {
        3,1,0,
        2,1,3,

        0,5,4,
        1,5,0,

        3,4,7,
        0,4,3,

        1,6,5,
        2,6,1,

        2,7,6,
        3,7,2,

        6,4,5,
        7,4,6,
    };

    desc.Usage = D3D10_USAGE_DEFAULT;
    desc.ByteWidth = sizeof(DWORD) * 36;
    desc.BindFlags = D3D10_BIND_INDEX_BUFFER;
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = 0;
    data.pSysMem = vertices;
    hr = m_device->CreateBuffer(&desc,&data,&m_indexBuffer);

    if(FAILED(hr)){
        MessageBox(NULL,TEXT("Index buffer creation failed"), TEXT("Error"),MB_OK);
        return hr;
    }


    m_device->IASetIndexBuffer(m_indexBuffer,DXGI_FORMAT_R32_FLOAT,0);

    //Set the primitive topology, i.e. how indices should be interpreted (here, as a triangle list)
    m_device->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    D3DXMatrixIdentity(&m_world);

    D3DXVECTOR3 eye(0.0f, 1.0f, -10.0f);
    D3DXVECTOR3 at(0.0f, 1.0f, 0.0f);
    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);

    D3DXMatrixLookAtLH(&m_view, &eye, &at, &up);

    D3DXMatrixPerspectiveFovLH(&m_projection, (float)D3DX_PI * 0.25f, m_width/(FLOAT)m_height, 0.1f, 100.0f);

    return hr;
}

再一次,它与我之前提到的教程完全相同(但封装了)。

当我在IDE中打开Tutorial Visual Studio解决方案时,它可以很好地显示场景中描述的内容,但是当我尝试运行此代码的“封装”版本时,除了背景颜色之外什么也没有显示。 ..

注意:我的Windows消息泵工作正常,我甚至可以按照我想要的方式处理用户输入,一切都很好。我的应用程序正确执行了我的引擎初始化(我检查每个返回的错误代码,除了S_OK代码之外别无其他)。

我不知道现在在哪里搜索。我已经检查了我的代码次数和时间,它与教程完全相同,我已经检查了我封装的所有内容都已正确设置和访问等,但我​​仍然无法显示除背景颜色之外的任何内容。 。

我想知道这里是否有人可以知道可能导致这种情况的原因,或者至少提示在哪里寻找......

编辑:使用的效果文件:

//--------------------------------------------------------------------------------------
// File: Tutorial05.fx
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//--------------------------------------------------------------------------------------

//--------------------------------------------------------------------------------------
// Constant Buffer Variables
//--------------------------------------------------------------------------------------
matrix World;
matrix View;
matrix Projection;

//--------------------------------------------------------------------------------------
struct VS_INPUT
{
    float4 Pos : POSITION;
    float4 Color : COLOR;
};

struct PS_INPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};


//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output = (PS_INPUT)0;
    output.Pos = mul( input.Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Color = input.Color;

    return output;
}


//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 PS( PS_INPUT input) : SV_Target
{
    return input.Color;
}


//--------------------------------------------------------------------------------------
technique10 Render
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, VS() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, PS() ) );
    }
}

1 个答案:

答案 0 :(得分:2)

我认为,这可能是一个错误:

D3D(10和11)管道的输入汇编程序阶段始终等待索引缓冲区的DXGI_FORMAT_***_UINT格式。 MSDN证明了这一点:

  

DXGI_FORMAT,指定索引中数据的格式   缓冲。索引缓冲区数据允许的唯一格式是16位   (DXGI_FORMAT_R16_UINT)和32位(DXGI_FORMAT_R32_UINT)整数。

然后查看将缓冲区绑定到IA的代码:

m_device->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_FLOAT, 0);

我认为你应该在你的情况下使用DXGI_FORMAT_R32_UINT,如下所示:

m_device->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_UINT, 0);