DirectX:屏幕上没有绘制任何内容

DirectX : Nothing is drawn on screen

本文关键字:绘制 任何内 屏幕 DirectX      更新时间:2023-10-16

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

问题是,它只显示我用来清除backbuffer的颜色。

(我为后面相当大的代码块道歉)。

这是我的渲染函数:
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);
}

这是完全相同的第5教程DirectX10在DirectX SDK(2010年6月)在"样品"文件夹下,除了它被封装在一个对象。

我的场景初始化如下:

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中打开教程Visual Studio解决方案时,它工作并且很好地显示了场景中描述的内容,但是当我尝试运行我的"封装"版本的代码时,除了背景颜色之外什么都没有显示…

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

我现在不知道去哪里找。我已经检查了我的代码一遍又一遍,它是完全相同的教程,我已经检查了我封装的一切设置和访问正确等,但我仍然不能显示任何东西,除了背景颜色…

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

EDIT: Effect file used:

//--------------------------------------------------------------------------------------
// 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() ) );
    }
}

我想,这可能是一个错误:

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);