2

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 (2010 年 6 月) の "Samples" フォルダーにある DirectX10 の 5 番目のチュートリアルとまったく同じです。

私のシーンは次のように初期化されます:

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:使用エフェクトファイル:

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

1 に答える 1

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

于 2013-03-13T05:05:23.310 に答える