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 += -Wno-error=unused-variable
|
||||||
CFLAGS += -DUNICODE
|
CFLAGS += -DUNICODE
|
||||||
|
|
||||||
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9
|
LDFLAGS += -Wl,--subsystem,windows -mwindows -mconsole -municode -ld3d9 -ld3dx9 -lwinmm
|
||||||
|
|
||||||
OPT = -Og
|
OPT = -Og
|
||||||
|
|
||||||
|
|||||||
112
main.cpp
112
main.cpp
@ -1,18 +1,19 @@
|
|||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <d3d9.h>
|
#include <d3d9.h>
|
||||||
|
#include <d3dx9.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
struct CUSTOMVERTEX {
|
struct CUSTOMVERTEX
|
||||||
float x, y, z, rhw;
|
{
|
||||||
|
float x, y, z;
|
||||||
uint32_t color;
|
uint32_t color;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
|
const CUSTOMVERTEX g_Vertices[] = {
|
||||||
|
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
|
||||||
const CUSTOMVERTEX vertices[] = {
|
{ 1.0f,-1.0f, 0.0f, 0xff0000ff, },
|
||||||
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000 },
|
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },
|
||||||
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00 },
|
|
||||||
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff },
|
|
||||||
};
|
};
|
||||||
|
|
||||||
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
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;
|
IDirect3D9 * g_pD3D = NULL;
|
||||||
IDirect3DDevice9 * g_pd3dDevice = NULL;
|
IDirect3DDevice9 * g_pd3dDevice = NULL;
|
||||||
IDirect3DVertexBuffer9 * g_pVB = NULL;
|
IDirect3DVertexBuffer9 * g_pVB = NULL;
|
||||||
|
IDirect3DVertexDeclaration9 * g_pVertexDeclaration = NULL;
|
||||||
|
ID3DXConstantTable * g_pConstantTable = NULL;
|
||||||
|
IDirect3DVertexShader9 * g_pVertexShader = NULL;
|
||||||
|
|
||||||
HRESULT InitDirect3D(HWND hwnd)
|
HRESULT InitDirect3D(HWND hwnd)
|
||||||
{
|
{
|
||||||
@ -42,6 +46,9 @@ HRESULT InitDirect3D(HWND hwnd)
|
|||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
|
||||||
|
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,16 +61,42 @@ void Cleanup()
|
|||||||
g_pD3D->Release();
|
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()
|
void Render()
|
||||||
{
|
{
|
||||||
if (g_pd3dDevice == NULL)
|
if (g_pd3dDevice == NULL)
|
||||||
return;
|
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();
|
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->SetStreamSource(0, g_pVB, 0, (sizeof (CUSTOMVERTEX)));
|
||||||
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
|
|
||||||
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
|
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
|
||||||
g_pd3dDevice->EndScene();
|
g_pd3dDevice->EndScene();
|
||||||
|
|
||||||
@ -102,9 +135,13 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
|||||||
|
|
||||||
HRESULT res;
|
HRESULT res;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// vertex buffer
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length
|
res = g_pd3dDevice->CreateVertexBuffer(3 * (sizeof (CUSTOMVERTEX)), // length
|
||||||
0, // usage
|
0, // usage
|
||||||
D3DFVF_CUSTOMVERTEX, // FVF
|
0,//D3DFVF_CUSTOMVERTEX, // FVF
|
||||||
D3DPOOL_DEFAULT, // Pool
|
D3DPOOL_DEFAULT, // Pool
|
||||||
&g_pVB, //ppVertexBuffer
|
&g_pVB, //ppVertexBuffer
|
||||||
NULL //pSharedHandle
|
NULL //pSharedHandle
|
||||||
@ -113,14 +150,63 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
void * pVertices;
|
void * pVertices;
|
||||||
res = g_pVB->Lock(0, (sizeof (vertices)), &pVertices, 0);
|
res = g_pVB->Lock(0, (sizeof (g_Vertices)), &pVertices, 0);
|
||||||
if (FAILED(res))
|
if (FAILED(res))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
memcpy(pVertices, vertices, (sizeof (vertices)));
|
memcpy(pVertices, g_Vertices, (sizeof (g_Vertices)));
|
||||||
|
|
||||||
g_pVB->Unlock();
|
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);
|
ShowWindow(hwnd, nCmdShow);
|
||||||
UpdateWindow(hwnd);
|
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