DX11 Instancing SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND



  • Hallo, ich hänge jetzt schon seit zwei Tagen an einem Problem fest, das mich nicht mehr los lässt. Ich habe versucht, statt für jedes Objekt einmal die draw() funktion aufzurufen, alle Objektpositionen in einen instance buffer zu schreiben, und von dort alle auf einmal zeichnen zu lassen. Leider kommen die Positionsvektoren im VS nicht an. In PIX bekomme ich folgenden Error:

    Message Render D3D11: ERROR: ID3D11DeviceContext::DrawIndexedInstanced: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The input stage requires Semantic/Index (INSTTRANS,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND ]
    

    Initialisierung des input layouts

    struct INSTANCE {
    	D3DXVECTOR3 matTrans;
    };
    //***//
    
        D3D11_INPUT_ELEMENT_DESC ied[] =
        {
    		//vertex buffer
            {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
    		{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,  12, D3D11_INPUT_PER_VERTEX_DATA, 0},
            {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0,  24, D3D11_INPUT_PER_VERTEX_DATA, 0},
    
    		//instance buffer
    		{"INSTTRANS", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, 0, D3D11_INPUT_PER_INSTANCE_DATA, 1},
        };
    	if (FAILED(d3ddev->CreateInputLayout(ied, 4, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout))) throw(std::string("Input Layout Creation Error"));
        d3ddevcon->IASetInputLayout(pLayout);
    

    Zeichnen des Objekts:

    UINT stride[2] = {sizeof(VERTEX), sizeof(INSTANCE)};
    		UINT offset[2] = {0, 0};
    		ID3D11Buffer* combinedBuffer[2] = {meshVertBuff, instanceBuffer};
    		d3ddevcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    		d3ddevcon->IASetVertexBuffers(0, 2, combinedBuffer, stride, offset);
    		d3ddevcon->IASetIndexBuffer(meshIndexBuff, DXGI_FORMAT_R32_UINT, 0);
    
    		std::map<std::wstring, OBJMATERIAL>::iterator fit;
    		for (std::vector<DRAWLIST>::iterator it = drawList.begin(); it != drawList.end(); it++) {
    			fit = objMaterials.find((*it).material);
    			if (fit != objMaterials.end()) {
    				if ((*fit).second.texture != NULL) {
    					d3ddevcon->PSSetShaderResources(0, 1, &((*fit).second.texture));
    				}
    				d3ddevcon->DrawIndexedInstanced((*it).indexCount, instanceCount, (*it).startIndex, 0, 0);
    			}
    		}
    
    struct VIn
    {
    	float3 position : POSITION;
    	float3 normal : NORMAL;
    	float2 texcoord : TEXCOORD;
    	float3 instTrans : INSTTRANS;
    	uint instanceID : SV_InstanceID;
    };
    
    VOut VShader(VIn input)
    {
    	VOut output;
    
    	//first: transforming instance
    	//output.position = mul(input.instTrans, input.position);
    	output.position = float4(input.position,1.0);
    	output.position.xyz *= 50.0; //scale
    	output.position.xyz += input.instTrans.xyz; //apply repositioning
    
    	float4 transPos = mul(world, output.position); //transform position with world matrix
    
        output.position = mul(view, transPos);  //project to screen
    /***/
    

    Wenn ich die Variable "instTrans : INSTTRANS" aus dem shader entferne, dann verschwindet der Fehler. Die Variabele instTrans ist laut Shader debugging Null.
    In meiner testszene zwichne ich zwei Objekte. Sie liegen dabei beide aufeinander.
    Irgendwelche ideen?

    beste Grüße,
    subcortex



  • Die lösung des Problems wurde durch sukzessives Auskommentieren gelöst.
    Folgende Stelle wurde angepasst:

    ID3D10Blob *VS, *VS2, *PS, *PS2; <- ÄNDERUNG: vorher wurde nur VS und PS benutzt
    
    	//volume shader
    	if (FAILED(D3DX11CompileFromFile(L"resources/volume.hlsl", 0, 0, "VShader", "vs_5_0", D3D10_SHADER_PREFER_FLOW_CONTROL | D3D10_SHADER_SKIP_OPTIMIZATION, 0, 0, &VS, 0, 0))) throw(std::string("Volume Shader Error 1"));
    	if (FAILED(D3DX11CompileFromFile(L"resources/volume.hlsl", 0, 0, "PShader", "ps_5_0", D3D10_SHADER_PREFER_FLOW_CONTROL | D3D10_SHADER_SKIP_OPTIMIZATION, 0, 0, &PS, 0, 0))) throw(std::string("Volume Shader Error 2"));
    	// encapsulate both shaders into shader objects
    	if (FAILED(d3ddev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pvolumeVS))) throw(std::string("Volume Shader Error 1A"));
    	if (FAILED(d3ddev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pvolumePS))) throw(std::string("Volume Shader Error 2A"));
    
    	//sky shader
    	if (FAILED(D3DX11CompileFromFile(L"resources/sky.hlsl", 0, 0, "VShader", "vs_5_0", D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, 0, &VS2, 0, 0))) throw(std::string("Sky Shader Error 1"));
    	if (FAILED(D3DX11CompileFromFile(L"resources/sky.hlsl", 0, 0, "PShader", "ps_5_0", D3D10_SHADER_OPTIMIZATION_LEVEL3, 0, 0, &PS2, 0, 0))) throw(std::string("Sky Shader Error 2"));
    	// encapsulate both shaders into shader objects
    	if (FAILED(d3ddev->CreateVertexShader(VS2->GetBufferPointer(), VS2->GetBufferSize(), NULL, &pskyVS))) throw(std::string("Sky Shader Error 1A"));
    	if (FAILED(d3ddev->CreatePixelShader(PS2->GetBufferPointer(), PS2->GetBufferSize(), NULL, &pskyPS))) throw(std::string("Sky Shader Error 2A"));
    

    Anscheinend darf man den selben Buffer nicht für mehrere Shader benutzen.
    Kann mir das jemand erklären?


Anmelden zum Antworten