|
|
呵呵!刚开始学习,扔鸡蛋到我的blog 嘻嘻!:)
#define INITGUID
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <d3d8.h>
#include <d3dx8.h>
#include <stdio.h>
#pragma comment(lib,"d3d8.lib")
#pragma comment(lib,"d3dx8.lib")
//Direct3D 全局变量
LPDIRECT3D8 pD3D = NULL;
LPDIRECT3DDEVICE8 pd3dDevice;
D3DXMATRIX matProj;//投影矩形
D3DXMATRIX matCameraView;
D3DXVECTOR3 vecCameraSource;
D3DXVECTOR3 vecCameraTarget;
LPDIRECT3DVERTEXBUFFER8 lpVertexBuffer = NULL;
LPDIRECT3DTEXTURE8 g_pTexture = NULL;
#define D3DFVF_MYVETTEX (D3DFVF_XYZ | D3DFVF_TEX1)
typedef struct MYVERTEX
{
float x,y,z,u,v;
}MYVERTEX ,*LPMYVERTEX;
MYVERTEX g_Verices[4];
const char *szWndClass = "Draw3DPrimitive";
const char *szProgramName = "Draw3DPrimitive Example";
HINSTANCE g_hInstance;
HWND g_hWnd;
LRESULT CALLBACK WindowProc(HWND hWnd,UINT Msg ,WPARAM wParam,LPARAM lParam);
HRESULT hrInit3D(HWND hWnd);
void vCleanup(void);
void vRenderScence(void);
void vSetupView(void);
void vInitGeometry(void);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPTSTR lpCmdLine,int nCmdShow)
{
WNDCLASSEX WndClass;
HWND hWnd;
MSG msg;
WndClass.cbSize = sizeof(WNDCLASSEX);
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = (WNDPROC)WindowProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
WndClass.hbrBackground = (HBRUSH)GetStockObject(NULL);
WndClass.lpszClassName = szWndClass;
WndClass.lpszMenuName = NULL;
WndClass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
if(!RegisterClassEx(&WndClass))
return (-1);
if(!(hWnd =
CreateWindowEx(
NULL,
szWndClass,
szProgramName,
WS_OVERLAPPEDWINDOW,
0,
0,
800,
600,
NULL,
NULL,
hInstance,
NULL)
))
return (-1);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
if(hrInit3D(hWnd) == E_FAIL)
{
DestroyWindow(hWnd);
}
vInitGeometry();
vSetupView();
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
vRenderScence();
}
}
vCleanup();
return ((int)msg.wParam);
}
LRESULT CALLBACK WindowProc(HWND hWnd,UINT Msg ,WPARAM wParam,LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(Msg)
{
case WM_CREATE:
{
return (0);
}
break;
case WM_PAINT:
{
hdc = BeginPaint(hWnd,&ps);
EndPaint(hWnd,&ps);
return (0);
}
break;
case WM_DESTROY:
{
PostQuitMessage(0);
return (0);
}
break;
default:
break;
}
return (DefWindowProc(hWnd,Msg,wParam,lParam));
}
HRESULT hrInit3D(HWND hWnd)
{
D3DPRESENT_PARAMETERS d3dpp;
D3DDISPLAYMODE d3ddm;
RECT rcWindowBounds;
RECT rcWindowClient;
//创建D3D对象
if(NULL == (pD3D = Direct3DCreate8(D3D_SDK_VERSION)))
{
return E_FAIL;
}
if(FAILED(pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL;
}
GetWindowRect(hWnd,&rcWindowBounds);
GetClientRect(hWnd,&rcWindowClient);
ZeroMemory(&d3dpp,sizeof(d3dpp));
//建立设备参数
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferWidth = (rcWindowClient.right - rcWindowClient.left);
d3dpp.BackBufferHeight = (rcWindowClient.bottom - rcWindowClient.top);
d3dpp.BackBufferFormat = d3ddm.Format;
d3dpp.BackBufferCount = 1;
d3dpp.SwapEffect = D3DSWAPEFFECT_FLIP;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.Windowed = TRUE;
//创建D3D设备
if(FAILED(pD3D -> CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&pd3dDevice)))
{
return E_FAIL;
}
//启动Z缓存
pd3dDevice -> SetRenderState(D3DRS_ZENABLE,TRUE);
pd3dDevice -> SetRenderState(D3DRS_AMBIENT,0xffffffff);
pd3dDevice -> SetRenderState(D3DRS_LIGHTING,FALSE);
return S_OK;
}
void vSetupView()
{
//设置照相机的原始点
vecCameraSource.x = 0.0f;
vecCameraSource.y = 0.0f;
vecCameraSource.z = 10.0f;
//设置照相机的目标点
vecCameraTarget.x = 0.0f;
vecCameraTarget.y = 0.0f;
vecCameraTarget.z = 0.0f;
D3DXMatrixLookAtLH(
&matCameraView,
&vecCameraSource,
&vecCameraTarget,
&D3DXVECTOR3(0.0f,1.0f,0.0f)
);
//告诉设备把照相机的视图作为视口
pd3dDevice -> SetTransform(D3DTS_VIEW,&matCameraView);
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
//告诉设备把上边的矩阵作为投影矩阵
pd3dDevice -> SetTransform(D3DTS_PROJECTION,&matProj);
}
void vCleanup(void)
{
if(g_pTexture != NULL)
g_pTexture -> Release();
if (lpVertexBuffer != NULL)
lpVertexBuffer -> Release();
if(pd3dDevice != NULL)
pd3dDevice -> Release();
if(pD3D != NULL)
pD3D -> Release();
UnregisterClass(szWndClass,g_hInstance);
}
void vRenderScence(void)
{
D3DXMATRIX matTranslation;
pd3dDevice -> Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
pd3dDevice -> BeginScene();
D3DXMatrixIdentity(&matTranslation);
pd3dDevice -> SetTransform(D3DTS_WORLD,&matTranslation);
pd3dDevice -> SetTexture(0,g_pTexture);
pd3dDevice -> SetStreamSource(0,lpVertexBuffer,sizeof(MYVERTEX));
pd3dDevice -> SetVertexShader(D3DFVF_MYVETTEX);
pd3dDevice -> DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2);
pd3dDevice -> SetTexture(0,NULL);
pd3dDevice -> EndScene();
pd3dDevice -> Present(NULL,NULL,NULL,NULL);
}
void vInitGeometry(void)
{
void *lpVertices;
float fSizeX = 5.0f;
float fSizeY = 5.0f;
//创建几何图形
g_Verices[0].x = -fSizeX / 2;
g_Verices[0].y = fSizeY / 2;
g_Verices[0].z = 0.0f;
g_Verices[0].u = 0.0f;
g_Verices[0].v = 0.0f;
g_Verices[1].x = -fSizeX / 2;
g_Verices[1].y = -fSizeY / 2;
g_Verices[1].z = 0.0f;
g_Verices[1].u = 0.0f;
g_Verices[1].v = 1.0f;
g_Verices[2].x = fSizeX / 2;
g_Verices[2].y = fSizeX / 2;
g_Verices[2].z = 0.0f;
g_Verices[2].u = -1.0f;
g_Verices[2].v = 0.0f;
g_Verices[3].x = fSizeX / 2;
g_Verices[3].y = -fSizeX / 2;
g_Verices[3].z = 0.0f;
g_Verices[3].u = -1.0f;
g_Verices[3].v = 1.0f;
//创建顶点缓存
if (FAILED(pd3dDevice -> CreateVertexBuffer(4*sizeof(MYVERTEX),0,D3DFVF_MYVETTEX,D3DPOOL_DEFAULT,&lpVertexBuffer)))
{
return;
}
if (FAILED(lpVertexBuffer -> Lock(0,sizeof(g_Verices),(BYTE**)&lpVertices,0)))
{
return;
}
memcpy(lpVertices,g_Verices,sizeof(g_Verices));
lpVertexBuffer ->Unlock();
if (FAILED(D3DXCreateTextureFromFile(pd3dDevice,"texture.jpg",&g_pTexture)))
{
return;
}
} |
|