Skip to main content
GameDev.net gamedev.net
🔒 Locked

DX10 Render Question

Started by CornyKorn21 Mar 18, 2008 at 5:21 PM 3 replies 3.8k views
Original Post
CornyKorn21
CornyKorn21
I've got a simple DirectX 10 3D program I wrote for class in order to display a varying number of triangles on screen then print out the FPS. I'm having an issue when I attempt to print text to screen. My triangles no longer render and I receive the following error messages in my output window: D3D10: ERROR: ID3D10Device::Draw: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The reason is that the input stage requires Semantic/Index (POSITION,0) as input, but it is not provided by the output stage. [ EXECUTION ERROR #342: DEVICE_SHADER_LINKAGE_SEMANTICNAME_NOT_FOUND ] D3D10: ERROR: ID3D10Device::Draw: Input Assembler - Vertex Shader linkage error: Signatures between stages are incompatible. The reason is that Semantic 'COLOR' is defined for mismatched hardware registers between the output stage and input stage. [ EXECUTION ERROR #343: DEVICE_SHADER_LINKAGE_REGISTERINDEX ] Any suggestions? If I do not attempt to run my DrawTextString function everything runs fine. Code:

void DX10App::DrawTextString(int x, int y, D3DXCOLOR color, const WCHAR* strOutput)
{
	LPCWSTR text = LPCWSTR(strOutput);
	FontSprite->Begin(0);
	RECT rect = {x, y, 100, 50};
	Font->DrawText(FontSprite, text, -1, ▭, DT_LEFT, color);
	FontSprite->End();
}

void DX10App::Render()
{
	D3DXMATRIX mTranslateStart;
	D3DXMATRIX mScale;
	D3DXMATRIX World1;

	D3DXMatrixIdentity(&World1);

	float ClearColor[4] = {0.0f, 0.125f, 0.3f, 1.0f};
	d3dDevice->ClearRenderTargetView(RenderTargetView, ClearColor);
	
	if(myApp->GetTriMode() == 0)
	{
		D3DXMatrixScaling(&mScale, 1.0f / triWidth, 1.0f / triHeight, 1.0f);
		D3DXMatrixTranslation(&mTranslateStart, -1.0f / (triWidth / (triWidth + 1.0f)), (triHeight - 1.0f) / triHeight, 0.0f);

		WorldVariable->SetMatrix((float*)&World1);

		D3D10_TECHNIQUE_DESC techDesc;
		Technique->GetDesc(&techDesc);

		D3DXMatrixIdentity(&World1);
		D3DXMatrixMultiply(&World1, &World1, &mScale);
		D3DXMatrixMultiply(&World1, &World1, &mTranslateStart);
		
		for(int i = 0; i < triHeight; ++i)
		{
			for(int j = 0; j < triWidth; ++j)
			{	
				//D3DXMatrixMultiply(&g_World1, &g_World1, &mTranslateRight);
				World1._41 += 2.0f / triWidth;

				WorldVariable->SetMatrix((float*)&World1);

				for(UINT p = 0; p < techDesc.Passes; ++p)
				{
					Technique->GetPassByIndex(p)->Apply(0);
					d3dDevice->Draw(3, 0);
				}
			}

			//D3DXMatrixMultiply(&g_World1, &g_World1, &mTranslateLeft);
			World1._41 += -2.0f;
			//D3DXMatrixMultiply(&g_World1, &g_World1, &mTranslateDown);
			World1._42 += -2.0f / triHeight;
		}
	}
	else if(myApp->GetTriMode() == 1)
	{
		D3D10_TECHNIQUE_DESC techDesc;
		Technique->GetDesc(&techDesc);

		WorldVariable->SetMatrix((float*)&World1);

		for(UINT p = 0; p < techDesc.Passes; ++p)
		{
			Technique->GetPassByIndex(p)->Apply(0);
			d3dDevice->Draw((int)triHeight * (int)triWidth * 3, 0);
		}
	}

	WCHAR str[255];
	swprintf_s(str, 255, L"FPS: %.2f NumTris: %d", FPS, (triWidth * triHeight));

	DrawTextString(0, 0, D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f), str);

	::SetWindowText(m_hWnd, str);

	SwapChain->Present(0, 0);
}
XVincentX
XVincentX
Mabye (remember, mabye) you should deactivate the shader, becouse, mabye, using NULL as ID3DXSprite, the shader code can't work on the text.
mmm ok it's wrong you are using sprite...

It's a my opinion so i do not know if it can work, but you can try in this way:

Just add this code before the DrawText, and use NULL as Sprite.

device->PSSetShader(NULL);device->VSSetShader(NULL);device->GSSetShader(NULL);


After the DrawText call, use
shader->GetTechniqueByIndex(0)->GetPassByName(0)->Apply();


Let me know about it.




Yes, i use DirectX10 from 1 week :D
CornyKorn21
CornyKorn21
That didn't seem to make any difference.

Thanks though.
Sc4Freak
Sc4Freak
It's because ID3DXFont/ID3DXSprite is modifying the state of the device - and not restoring it afterwards. To rectify this, pass in D3DX10_SPRITE_SAVE_STATE when calling ID3DSprite::Begin().
CornyKorn21
CornyKorn21
Thanks for your help. That was exactly it.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.