D3D9 & HLSL First Triangle (nothing appears on screen)

Started by
2 comments, last by karwosts 13 years, 4 months ago
I've been doing OpenGL for a while and decided to try out the DirectX API, so I've got a sample application that I'm trying to use to render my 'hello world' triangle, but it's not appearing on the screen.

I got it to show up using fixed pipeline commands, but once I tried with HLSL I wasn't able to get anything to appear. I've cobbled my code together from a bunch of random tutorials and API documentation, as I can't find a single comprehensive resource that explains how to link a hlsl shader to your directx program. I thought I had the basics of it down, but I'm sure I'm missing a simple step or two somewhere.

I stripped down my code to below, maybe someone can spot my error. I checked the HRESULT after every command and I do not get any errors, just an plain blue screen (the clear color). This should draw a white triangle right in the middle of the screen.

Also my project is ultimately a cross-API renderer, so I'm not interested in using the Effects framework, I'd like to manage my shader states myself.

Thanks for anyone who can help!

DX Code:
main(){	//snipped out windows init code 	d3d->CreateDevice(D3DADAPTER_DEFAULT,	                      D3DDEVTYPE_HAL,	                      hWnd,	                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,	                      &d3dpp,	                      &d3ddev);	#define VERTEXTYPE D3DFVF_XYZ	struct CUSTOMVERTEX	{		FLOAT x, y, z;    // from the D3DFVF_XYZ flag	};		CUSTOMVERTEX MyVertices[] =	{		{-1.f, 0.f, 5.0f, },		{0, 1.f, 5.0f, },		{1.f, 0, 5.0f, },	};	LPDIRECT3DVERTEXBUFFER9 v_buffer;	d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),								0,								VERTEXTYPE,								D3DPOOL_MANAGED,								&v_buffer,								NULL);	VOID* pVoid;    // the void* we were talking about	v_buffer->Lock(0, 0, (void**)&pVoid, 0);    // locks v_buffer, the buffer we made earlier	memcpy(pVoid, MyVertices, sizeof(MyVertices));    // copy vertices to the vertex buffer	v_buffer->Unlock();    // unlock v_buffer	D3DXMATRIX matProjection;	LPD3DXBUFFER vshader;	LPD3DXBUFFER pshader;	LPD3DXBUFFER errorMsgs;	LPD3DXCONSTANTTABLE vsConstantTable;	LPD3DXCONSTANTTABLE psConstantTable;	std::string filename = SHADER_PATH + std::string("DX9//singleColor.hlsl9.vs");	HRESULT hr;	if(FAILED(hr = D3DXCompileShaderFromFile(filename.c_str(),NULL,NULL,"main","vs_2_0",NULL,&vshader,&errorMsgs,&vsConstantTable))){				return 0;	} 	filename = SHADER_PATH + std::string("DX9//singleColor.hlsl9.ps");	if(FAILED(hr = D3DXCompileShaderFromFile(filename.c_str(),NULL,NULL,"main","ps_2_0",NULL,&pshader,&errorMsgs,&psConstantTable))){		return 0;	} 	IDirect3DVertexShader9* vs;	IDirect3DPixelShader9* ps;	if(FAILED(hr = d3ddev->CreateVertexShader((DWORD*)vshader->GetBufferPointer(),&vs))){return 0;}	if(FAILED(hr = d3ddev->CreatePixelShader((DWORD*)pshader->GetBufferPointer(),&ps))){return 0;}	D3DXHANDLE handle;	handle = vsConstantTable->GetConstantByName(NULL,"mvpMatrix");	if(FAILED(hr = d3ddev->SetVertexShader(vs))){return 0;}	if(FAILED(hr = d3ddev->SetPixelShader(ps))){return 0;}	D3DVERTEXELEMENT9 decl[] = {		{0,0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},		D3DDECL_END()		};	LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration;	if(FAILED(hr = d3ddev->CreateVertexDeclaration(decl,&m_pVertexDeclaration))){return 0;}	if(FAILED(hr = d3ddev->SetVertexDeclaration(m_pVertexDeclaration))){return 0;}	D3DXMatrixPerspectiveFovLH(&matProjection,D3DXToRadian(45.f),(float)WINDOW_WIDTH/WINDOW_HEIGHT,0.1f,100.0f);	D3DXMATRIX mvpMatrix = matProjection;	if(FAILED(hr = vsConstantTable->SetMatrix(d3ddev,handle,&mvpMatrix))){return 0;}    	//render loop    while(TRUE)	{		//snipped message code		 // clear the window to a deep blue		d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 40, 100), 1.0f, 0);		d3ddev->BeginScene();    // begins the 3D scene		if(FAILED(hr = d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX)))){return 0;}		if(FAILED(hr = d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1))){return 0;}		if(FAILED(hr = d3ddev->EndScene())){return 0;}   // ends the 3D scene		if(FAILED(hr = d3ddev->Present(NULL, NULL, NULL, NULL))){return 0;}    // displays the created frame	}        d3ddev->Release();    // close and release the 3D device    d3d->Release();    // close and release Direct3D	return msg.wParam;}


Vertex Shader
float4x4 mvpMatrix;struct VS_IN{	float3 Pos : POSITION;};struct VS_OUT{	float4 Pos : POSITION;};VS_OUT main(VS_IN In) {	VS_OUT Out;	Out.Pos = mul (mvpMatrix, float4(In.Pos,1));	return Out;}


Pixel Shader:
struct PS_IN {};struct PS_OUT {	float4 Color : COLOR;};PS_OUT main(PS_IN In){	PS_OUT Out;	Out.Color = float4(1,1,1,1);	return Out;}
[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game
Advertisement
Try with D3DRS_LIGHTING on or off.

I had the same issues recently and it didn't show up because of lack of normals.
Your mul(mvpMatrix, position) should be mul(position, mvpMatrix). This can differ depending on how you set up your matrices.
Quote:Original post by Erik Rufelt
Your mul(mvpMatrix, position) should be mul(position, mvpMatrix). This can differ depending on how you set up your matrices.


Thanks, that was it :D

Guess I've been in the habit of using column major matrices.

[size=2]My Projects:
[size=2]Portfolio Map for Android - Free Visual Portfolio Tracker
[size=2]Electron Flux for Android - Free Puzzle/Logic Game

This topic is closed to new replies.

Advertisement