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