0

我正在尝试将网格加载到 DirectX 10 中。我创建了一堆处理它的类,并允许我在主游戏类中只用一行代码调用网格。

然而,当我运行程序时,这就是呈现的内容:在此处输入图像描述

在调试输出窗口中,不断出现以下错误:

D3D10:错误:ID3D10Device::DrawIndexed:输入汇编器 - 顶点着色器链接错误:阶段之间的签名不兼容。原因是语义“TEXCOORD”是为输出级和输入级之间不匹配的硬件寄存器定义的。[执行错误#343:DEVICE_SHADER_LINKAGE_REGISTERINDEX] D3D10:错误:ID3D10Device::DrawIndexed:输入汇编器-顶点着色器链接错误:阶段之间的签名不兼容。原因是输入级需要语义/索引(POSITION,0)作为输入,但输出级不提供。[执行错误#342:DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND]

问题是,我不知道如何解决这个问题。我正在使用的代码确实有效,我只是将所有这些代码带入了我的一个新项目。没有构建错误,并且仅在游戏运行时出现

.fx 文件如下:

float4x4 matWorld;
float4x4 matView;
float4x4 matProjection;

struct VS_INPUT
{
    float4 Pos:POSITION;
    float2 TexCoord:TEXCOORD;
};

struct PS_INPUT
{
    float4 Pos:SV_POSITION;
    float2 TexCoord:TEXCOORD;
};

Texture2D diffuseTexture;

SamplerState diffuseSampler
{
    Filter = MIN_MAG_MIP_POINT;
    AddressU = WRAP;
    AddressV = WRAP;
};

//
// Vertex Shader
//
PS_INPUT VS( VS_INPUT input )
{
    PS_INPUT output=(PS_INPUT)0;

    float4x4 viewProjection=mul(matView,matProjection);
    float4x4 worldViewProjection=mul(matWorld,viewProjection);

    output.Pos=mul(input.Pos,worldViewProjection);
    output.TexCoord=input.TexCoord;
    return output;
}


//
// Pixel Shader
//
float4 PS(PS_INPUT input ) : SV_Target
{
    return diffuseTexture.Sample(diffuseSampler,input.TexCoord);
    //return float4(1.0f,1.0f,1.0f,1.0f);
}

RasterizerState  NoCulling
{
    FILLMODE=SOLID;
    CULLMODE=NONE;
};

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

在我的游戏中,.fx 文件和模型被调用并设置如下:

加载着色器文件

    //Set the shader flags - BMD
    DWORD dwShaderFlags = D3D10_SHADER_ENABLE_STRICTNESS;

#if defined( DEBUG ) || defined( _DEBUG )
    dwShaderFlags |= D3D10_SHADER_DEBUG;
#endif
    ID3D10Blob * pErrorBuffer=NULL;


    if( FAILED( D3DX10CreateEffectFromFile( TEXT("TransformedTexture.fx" ), NULL, NULL, "fx_4_0", dwShaderFlags, 0, md3dDevice, NULL, NULL, &m_pEffect, &pErrorBuffer, NULL ) ) )
    {
        char * pErrorStr = ( char* )pErrorBuffer->GetBufferPointer();
        //If the creation of the Effect fails then a message box will be shown
        MessageBoxA( NULL, pErrorStr, "Error", MB_OK );
        return false;
    }

    //Get the technique called Render from the effect, we need this for rendering later on 
    m_pTechnique=m_pEffect->GetTechniqueByName("Render");

    //Number of elements in the layout 
    UINT numElements = TexturedLitVertex::layoutSize;

    //Get the Pass description, we need this to bind the vertex to the pipeline 
    D3D10_PASS_DESC PassDesc;
    m_pTechnique->GetPassByIndex( 0 )->GetDesc( &PassDesc );

    //Create Input layout to describe the incoming buffer to the input assembler
    if (FAILED(md3dDevice->CreateInputLayout( TexturedLitVertex::layout, numElements,PassDesc.pIAInputSignature, PassDesc.IAInputSignatureSize, &m_pVertexLayout ) ) ) 
    {
        return false;
    }

模型加载:

m_pTestRenderable=new CRenderable();
//m_pTestRenderable->create<TexturedVertex>(md3dDevice,8,6,vertices,indices);

    m_pModelLoader = new CModelLoader();
    m_pTestRenderable = m_pModelLoader->loadModelFromFile( md3dDevice,"armoredrecon.fbx" );
    m_pGameObjectTest = new CGameObject();
    m_pGameObjectTest->setRenderable( m_pTestRenderable );



    // Set primitive topology, how are we going to interpet the vertices in the vertex buffer 
    md3dDevice->IASetPrimitiveTopology( D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST );    

    if ( FAILED( D3DX10CreateShaderResourceViewFromFile( md3dDevice, TEXT( "armoredrecon_diff.png" ), NULL, NULL, &m_pTextureShaderResource, NULL ) ) )
    {
        MessageBox( NULL, TEXT( "Can't load Texture" ), TEXT( "Error" ), MB_OK );
        return false;
    }

    m_pDiffuseTextureVariable = m_pEffect->GetVariableByName( "diffuseTexture" )->AsShaderResource();
    m_pDiffuseTextureVariable->SetResource( m_pTextureShaderResource );

最后是draw函数代码:

//All drawing will occur between the clear and present 
    m_pViewMatrixVariable->SetMatrix( ( float* )m_matView );
    m_pWorldMatrixVariable->SetMatrix( ( float* )m_pGameObjectTest->getWorld() );

    //Get the stride(size) of the a vertex, we need this to tell the pipeline the size of one vertex 
    UINT stride = m_pTestRenderable->getStride();

    //The offset from start of the buffer to where our vertices are located 
    UINT offset = m_pTestRenderable->getOffset();
    ID3D10Buffer * pVB=m_pTestRenderable->getVB();

    //Bind the vertex buffer to input assembler stage -
    md3dDevice->IASetVertexBuffers( 0, 1, &pVB, &stride, &offset );
    md3dDevice->IASetIndexBuffer( m_pTestRenderable->getIB(), DXGI_FORMAT_R32_UINT, 0 );

    //Get the Description of the technique, we need this in order to loop through each pass in the technique
    D3D10_TECHNIQUE_DESC techDesc;
    m_pTechnique->GetDesc( &techDesc );

    //Loop through the passes in the technique 
    for( UINT p = 0; p < techDesc.Passes; ++p )
    {
        //Get a pass at current index and apply it 
        m_pTechnique->GetPassByIndex( p )->Apply( 0 );

        //Draw call
        md3dDevice->DrawIndexed(m_pTestRenderable->getNumOfIndices(),0,0);
        //m_pD3D10Device->Draw(m_pTestRenderable->getNumOfVerts(),0);
    }

有什么我明显做错或遗漏的事情吗?花了 2 周时间试图锻炼我到底做错了什么,但无济于事。

一双新的眼睛可以对此提供任何见解,这将是很棒的。

4

0 回答 0