Jump to content
  • Advertisement
Sign in to follow this  
karwosts

OpenGL D3D9 & HLSL First Triangle (nothing appears on screen)

This topic is 2922 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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


Share this post


Link to post
Share on other sites
Advertisement
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.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!