关于Direct3D绘制的顶点顺序

 

 

关于Direct3D绘制的

 

首先D3D有三种基本图元,外加三种绘制方式,有六种组合,默认顶点顺序是顺时针绕序,虽然如此,但是在实际绘制时,有一些变通之处,使人迷惑。

 
一、列,包括点列,线列和三角形列:
 
这个不需要多说,因为互相之间没有共享元素(虽然可能有重叠现象,但不能算作共享),所以按顺序给出所有顶点即可,如果有重叠的点,也需要重复给出。其中点列和线列没有顺序一说,三角形按照顺时针绕序给出即可。
 
 
 
二、线带:
 
第一条线给出两个点,其他线给出最后一个点即可,即共享的点不需要重复给出。
 
 
 
三、三角形带:
 
第一个三角形按顺时针绕序给出,其他三角形给出最后一个点即可,这里有个需要注意的地方,出第一个三角形外,其他三角形只需要输入第三个顶点,这个顶点与前一个三角形中的后两个顶点组成新的三角形,给顶点时需要注意,如下图,给出顶点的顺序应该是((1, 1, 0),(3, 5, 0),(5, 1, 0),(7, 5, 0),(9, 1, 0),(11, 5, 0)。
 
 
 
 
 
 
四、三角扇形
 
第一个三角形先给出所有三角形共享的点,然后按照顺时针绕序给出其他点,后面的三角形给出非共享的点即可,如下图,顶点顺序应该是(4, 0, 0),(1, 5, 0),(3, 5, 0),(5, 5, 0),(7, 5, 0)。



 
#include"D3DUtil.h"
#include<windows.h>
#include<stdio.h>
#include<d3d9.h>
#include<d3dx9.h>
struct CUSTOMVERTEX
{
float x, y, z;
DWORD color;
};
#define WINDOW_WIDTH GetSystemMetrics(SM_CXSCREEN)
#define WINDOW_HEIGHT GetSystemMetrics(SM_CYSCREEN)
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib")
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DINDEXBUFFER9 g_pIndexBuffer = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVertexBuffer = NULL;
ID3DXFont *g_pFont = NULL;
wchar_t g_strFPS[50] = { 0 };
wchar_t g_strAdapter[60] = { 0 };
 
HRESULT Direct3D_Init(HWND hwnd,HINSTANCE hinstance);
HRESULT Direct3D_Render(HWND hwnd);
HRESULT Objects_Init();
VOID Direct3D_CleanUp();
float Get_FPS();
VOID Matrix_Set();
 
HRESULT Direct3D_Init(HWND hwnd, HINSTANCE hinstance)
{
LPDIRECT3D9 pD3D;
if (FAILED(pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
}
D3DCAPS9 caps;
DWORD vp;
if(FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps)))
{
return E_FAIL;
}
if (caps.DeviceType&D3DDEVCAPS_HWTRANSFORMANDLIGHT)
vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
else
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
D3DPRESENT_PARAMETERS d3dpp;
d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
d3dpp.BackBufferHeight = WINDOW_HEIGHT;
d3dpp.BackBufferWidth = WINDOW_WIDTH;
d3dpp.EnableAutoDepthStencil = TRUE;
d3dpp.Flags = 0;
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.hDeviceWindow = hwnd;
d3dpp.MultiSampleQuality = 0;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;
D3DADAPTER_IDENTIFIER9 Adapter;
if (FAILED(pD3D->GetAdapterIdentifier(D3DADAPTER_DEFAULT, NULL, &Adapter)))
{
return E_FAIL;
}
int len = MultiByteToWideChar(CP_ACP, NULL, Adapter.Description, -1, 0, 0);
MultiByteToWideChar(CP_ACP, NULL, Adapter.Description, -1, g_strAdapter, len);
wchar_t temp[60] = L"当前显卡为:";
wcscat_s(temp, g_strAdapter);
wcscpy_s(g_strAdapter, temp);
if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, vp, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
//g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
if (FAILED(Objects_Init()))
{
return E_FAIL;
}
SAFE_RELEASE(pD3D);
return S_OK;
}
 
HRESULT Direct3D_Render(HWND hwnd)
{
RECT rect;
GetClientRect(hwnd, &rect);
int charCount = swprintf_s(g_strFPS, 20, L"FPS=%0.3f", Get_FPS());
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | 
D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
g_pd3dDevice->BeginScene();
Matrix_Set();
g_pd3dDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(CUSTOMVERTEX));
if (GetAsyncKeyState(0x31) & 0x80)
g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
g_pd3dDevice->SetFVF(D3DFVF_DIFFUSE | D3DFVF_XYZ);
g_pd3dDevice->SetIndices(g_pIndexBuffer);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);
g_pFont->DrawText(NULL, g_strFPS, charCount, &rect, DT_TOP | DT_RIGHT, D3DCOLOR_XRGB(255, 233, 0, 0));
g_pFont->DrawText(NULL, g_strAdapter, -1, &rect, DT_TOP | DT_LEFT, D3DCOLOR_XRGB(255, 233, 0));
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
return S_OK;
}
 
HRESULT Objects_Init()
{
srand(timeGetTime());
D3DXCreateFont(g_pd3dDevice, 30, 30, 30, NULL, TRUE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
DEFAULT_QUALITY, NULL, L"微软雅黑", &g_pFont);
if (FAILED(g_pd3dDevice->CreateVertexBuffer(8 * sizeof(CUSTOMVERTEX), NULL,
D3DFVF_DIFFUSE | D3DFVF_XYZ, D3DPOOL_DEFAULT, &g_pVertexBuffer, NULL)))
{
return E_FAIL;
}
if (FAILED(g_pd3dDevice->CreateIndexBuffer(36 * sizeof(WORD), NULL, D3DFMT_INDEX16,
D3DPOOL_DEFAULT, &g_pIndexBuffer, NULL)))
{
return E_FAIL;
}
VOID *pVertexBuffer = NULL;
CUSTOMVERTEX Vertices[] = {
{ -20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ -20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ 20.0f, 20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ 20.0f, 20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
 
{ -20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ -20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ 20.0f, -20.0f, 20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
{ 20.0f, -20.0f, -20.0f, D3DCOLOR_XRGB(rand() % 256, rand() % 256, rand() % 256) },
};
g_pVertexBuffer->Lock(0,sizeof(Vertices),&pVertexBuffer,NULL);
memcpy(pVertexBuffer, Vertices, sizeof(Vertices));
g_pVertexBuffer->Unlock();
 
WORD *pIndices;
g_pIndexBuffer->Lock(0, 0, (void**)&pIndices, 0);
pIndices[0] = 0, pIndices[1] = 1, pIndices[2] = 2;
pIndices[3] = 0, pIndices[4] = 2, pIndices[5] = 3;
 
pIndices[6] = 0, pIndices[7] = 3, pIndices[8] = 7;
pIndices[9] = 0, pIndices[10] = 7, pIndices[11] = 4;
 
pIndices[12] = 0, pIndices[13] = 5, pIndices[14] = 1;
pIndices[15] = 0, pIndices[16] = 4, pIndices[17] = 5;
 
pIndices[18] = 2, pIndices[19] = 6, pIndices[20] = 7;
pIndices[21] = 2, pIndices[22] = 7, pIndices[23] = 3;
 
pIndices[24] = 2, pIndices[25] = 1, pIndices[26] = 5;
pIndices[27] = 2, pIndices[28] = 5, pIndices[29] = 6;
 
pIndices[30] = 4, pIndices[31] = 6, pIndices[32] = 5;
pIndices[33] = 4, pIndices[34] = 7, pIndices[35] = 6;
g_pIndexBuffer->Unlock();
return S_OK;
}
 
float Get_FPS()
{
static float currentTime = 0.0f;
static float lastTime = 0.0f;
static float fps = 0.0f;
static int frameCount;
 
currentTime = timeGetTime()*0.001f;
frameCount++;
 
if (currentTime - lastTime > 1.0f)
{
(float)fps = (float)frameCount / (currentTime - lastTime);
lastTime = currentTime;
frameCount = 0;
}
 
return (float)fps;
}
 
VOID Direct3D_CleanUp()
{
SAFE_RELEASE(g_pd3dDevice);
SAFE_RELEASE(g_pFont);
}
 
VOID Matrix_Set()
{
D3DXMATRIX matWorld, Rx, Ry,Rz;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixRotationX(&Rx, D3DX_PI*(timeGetTime()*0.001f));
D3DXMatrixRotationY(&Ry, D3DX_PI*(timeGetTime()*0.001f));
D3DXMatrixRotationZ(&Rz, D3DX_PI*(timeGetTime()*0.001f));
matWorld = matWorld = Rx*Ry*Rz*matWorld;
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
 
D3DXMATRIX matView;
D3DXVECTOR3 vEye(0.0f, 0.0f, -200.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
D3DXVECTOR3 vAt(0.0f, 0.0f, 0.0f);
D3DXMatrixLookAtLH(&matView, &vEye, &vAt, &vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
 
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4.0f, WINDOW_WIDTH / WINDOW_HEIGHT, 1.0f, 20000.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
 
D3DVIEWPORT9 vp;
vp.Height = WINDOW_HEIGHT;
vp.MaxZ = 1.0f;
vp.MinZ = 0.0f;
vp.Width = WINDOW_WIDTH;
vp.X = 0;
vp.Y = 0;
g_pd3dDevice->SetViewport(&vp);
}
 
LRESULT CALLBACK WndProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch (uMsg)
{
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
Direct3D_CleanUp();
PostQuitMessage(0);
break;
default:
DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int _stdcall WinMain(HINSTANCE hinstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcx;
wcx.cbClsExtra = 0;
wcx.cbSize = sizeof(WNDCLASSEX);
wcx.cbWndExtra = 0;
wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
wcx.hInstance = hinstance;
wcx.lpfnWndProc = WndProc;
wcx.lpszClassName = L"a";
wcx.lpszMenuName = NULL;
wcx.style = CS_HREDRAW | CS_VREDRAW;
BOOL bRet = RegisterClassEx(&wcx);
if (!bRet)
{
MessageBox(NULL, L"", L"", MB_OK);
return E_FAIL;
}
HWND hwnd = CreateWindowEx(WS_EX_CONTROLPARENT, L"a", NULL,
WS_VISIBLE | WS_OVERLAPPEDWINDOW, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT,
NULL, NULL, hinstance, NULL);
if (!hwnd)
{
MessageBox(NULL, L"", L"", MB_OK);
return E_FAIL;
}
if(FAILED(Direct3D_Init(hwnd, hinstance)))
{
return E_FAIL;
}
 
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = { 0 };
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, NULL, NULL,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Direct3D_Render(hwnd);
}
}
}
 

匿名评论(隐身草)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值