vertex shaded triangle
This commit is contained in:
parent
eedf590519
commit
be143930c8
2
Makefile
2
Makefile
@ -14,7 +14,7 @@ CFLAGS += -Wno-error=unused-function
|
||||
CFLAGS += -Wno-error=unused-variable
|
||||
CFLAGS += -DUNICODE
|
||||
|
||||
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9
|
||||
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9 -ld3dx9 -lwinmm
|
||||
|
||||
OPT = -Og
|
||||
|
||||
|
||||
112
main.cpp
112
main.cpp
@ -1,18 +1,19 @@
|
||||
#include <windows.h>
|
||||
#include <d3d9.h>
|
||||
#include <d3dx9.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct CUSTOMVERTEX {
|
||||
float x, y, z, rhw;
|
||||
struct CUSTOMVERTEX
|
||||
{
|
||||
float x, y, z;
|
||||
uint32_t color;
|
||||
};
|
||||
|
||||
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
|
||||
|
||||
const CUSTOMVERTEX vertices[] = {
|
||||
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000 },
|
||||
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00 },
|
||||
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff },
|
||||
const CUSTOMVERTEX g_Vertices[] = {
|
||||
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
|
||||
{ 1.0f,-1.0f, 0.0f, 0xff0000ff, },
|
||||
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },
|
||||
};
|
||||
|
||||
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
@ -20,6 +21,9 @@ LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||
IDirect3D9 * g_pD3D = NULL;
|
||||
IDirect3DDevice9 * g_pd3dDevice = NULL;
|
||||
IDirect3DVertexBuffer9 * g_pVB = NULL;
|
||||
IDirect3DVertexDeclaration9 * g_pVertexDeclaration = NULL;
|
||||
ID3DXConstantTable * g_pConstantTable = NULL;
|
||||
IDirect3DVertexShader9 * g_pVertexShader = NULL;
|
||||
|
||||
HRESULT InitDirect3D(HWND hwnd)
|
||||
{
|
||||
@ -42,6 +46,9 @@ HRESULT InitDirect3D(HWND hwnd)
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
|
||||
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
@ -54,16 +61,42 @@ void Cleanup()
|
||||
g_pD3D->Release();
|
||||
}
|
||||
|
||||
D3DXMATRIX WorldViewProjection()
|
||||
{
|
||||
D3DXMATRIX matWorld;
|
||||
UINT iTime = timeGetTime() % 1000;
|
||||
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
|
||||
D3DXMatrixRotationY( &matWorld, fAngle );
|
||||
|
||||
D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
|
||||
D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
|
||||
D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
|
||||
D3DXMATRIX matView;
|
||||
D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
|
||||
|
||||
D3DXMATRIX matProj;
|
||||
D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
|
||||
|
||||
D3DXMATRIX mWorldViewProj = matWorld * matView * matProj;
|
||||
return mWorldViewProj;
|
||||
}
|
||||
|
||||
void Render()
|
||||
{
|
||||
if (g_pd3dDevice == NULL)
|
||||
return;
|
||||
|
||||
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
|
||||
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 10, 10), 1.0f, 0);
|
||||
|
||||
g_pd3dDevice->BeginScene();
|
||||
|
||||
D3DXMATRIX mWorldViewProj = WorldViewProjection();
|
||||
g_pConstantTable->SetMatrix(g_pd3dDevice, "mWorldViewProj", &mWorldViewProj);
|
||||
|
||||
g_pd3dDevice->SetVertexDeclaration(g_pVertexDeclaration);
|
||||
g_pd3dDevice->SetVertexShader(g_pVertexShader);
|
||||
|
||||
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, (sizeof (CUSTOMVERTEX)));
|
||||
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
|
||||
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
|
||||
g_pd3dDevice->EndScene();
|
||||
|
||||
@ -102,9 +135,13 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
||||
|
||||
HRESULT res;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// vertex buffer
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length
|
||||
0, // usage
|
||||
D3DFVF_CUSTOMVERTEX, // FVF
|
||||
0,//D3DFVF_CUSTOMVERTEX, // FVF
|
||||
D3DPOOL_DEFAULT, // Pool
|
||||
&g_pVB, //ppVertexBuffer
|
||||
NULL //pSharedHandle
|
||||
@ -113,14 +150,63 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
||||
return 0;
|
||||
|
||||
void * pVertices;
|
||||
res = g_pVB->Lock(0, (sizeof (vertices)), &pVertices, 0);
|
||||
res = g_pVB->Lock(0, (sizeof (g_Vertices)), &pVertices, 0);
|
||||
if (FAILED(res))
|
||||
return 0;
|
||||
|
||||
memcpy(pVertices, vertices, (sizeof (vertices)));
|
||||
memcpy(pVertices, g_Vertices, (sizeof (g_Vertices)));
|
||||
|
||||
g_pVB->Unlock();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// vertex declaration
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
const D3DVERTEXELEMENT9 decl[] = {
|
||||
{ 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 },
|
||||
{ 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 },
|
||||
D3DDECL_END()
|
||||
};
|
||||
|
||||
res = g_pd3dDevice->CreateVertexDeclaration(decl, &g_pVertexDeclaration);
|
||||
if (FAILED(res))
|
||||
return 0;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// vertex shader
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
LPD3DXBUFFER pCode;
|
||||
DWORD dwShaderFlags = 0;
|
||||
|
||||
res = D3DXCompileShaderFromFile(L"main.vsh", // pSrcFile
|
||||
NULL, // pDefines
|
||||
NULL, // pInclude
|
||||
"Main", // pFunctionName
|
||||
"vs_3_0", // pProfile
|
||||
dwShaderFlags, // Flags
|
||||
&pCode, // ppShader
|
||||
NULL, // ppErrorMsgs
|
||||
&g_pConstantTable // ppConstantTable
|
||||
);
|
||||
if (FAILED(res)) {
|
||||
fprintf(stderr, "D3DXCompileShader\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
res = g_pd3dDevice->CreateVertexShader((DWORD*)pCode->GetBufferPointer(), &g_pVertexShader);
|
||||
pCode->Release();
|
||||
if(FAILED(res)) {
|
||||
fprintf(stderr, "CreateVertexShader\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
fprintf(stderr, "success\n");
|
||||
fflush(stderr);
|
||||
|
||||
ShowWindow(hwnd, nCmdShow);
|
||||
UpdateWindow(hwnd);
|
||||
|
||||
|
||||
23
main.vsh
Normal file
23
main.vsh
Normal file
@ -0,0 +1,23 @@
|
||||
struct VS_INPUT
|
||||
{
|
||||
float3 Position : POSITION;
|
||||
float4 Color : COLOR0;
|
||||
};
|
||||
|
||||
struct VS_OUTPUT
|
||||
{
|
||||
float4 Position : POSITION; // vertex position
|
||||
float4 Diffuse : COLOR0; // vertex diffuse color
|
||||
};
|
||||
|
||||
float4x4 mWorldViewProj;
|
||||
|
||||
VS_OUTPUT Main(VS_INPUT Input)
|
||||
{
|
||||
VS_OUTPUT Output;
|
||||
|
||||
Output.Position = mul(float4(Input.Position, 1.0), mWorldViewProj);
|
||||
Output.Diffuse = Input.Color;
|
||||
|
||||
return Output;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user