设为首页 加入收藏

TOP

(Visual C++)游戏开发笔记之三――绘制图元 (二)
2014-11-23 20:17:44 】 浏览:1232
Tags:Visual 游戏 开发 笔记 之三 制图
t3D设为右手坐标系,但默认情况下,它使用的是左手坐标系。下面将介绍许多和坐标系打交道的函数。每个函数都有另一个可供选择的使用右手坐标系的形式。这样就可以很轻松地从Direct3D移植到OpenGL。

我们来写一个Lines(线段)演示程序。该演示程序将在屏幕中间绘制两条白色线段。

该程序的main源文件的全局部分代码如下所示:

[cpp]
#include
#define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "Drawing Lines"
// Function Prototypes...
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();
// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// Vertex buffer to hold the geometry.
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
// A structure for our custom vertex type
struct stD3DVertex
{
float x, y, z;
unsigned long color;
};
// Our custom FVF, which describes our custom vertex structure.
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
#include
#define WINDOW_CLASS "UGPDX"
#define WINDOW_NAME "Drawing Lines"
// Function Prototypes...
bool InitializeD3D(HWND hWnd, bool fullscreen);
bool InitializeObjects();
void RenderScene();
void Shutdown();
// Direct3D object and device.
LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
// Vertex buffer to hold the geometry.
LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
// A structure for our custom vertex type
struct stD3DVertex
{
float x, y, z;
unsigned long color;
};
// Our custom FVF, which describes our custom vertex structure.
#define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

上段代码的开始部分包含了Direct3D头文件d3d9.h。该文件是必需的,只有包含该文件才能使用Direct3D函数和结构。代码中接下来的两行是全局定义语句,这两个语句定义了窗口类名称和窗口标题。WinMain()函数将用到这两个字符串,并且为方便起见,可以在全局区对它们进行处理。

定义语句后面的几行代码是代码中将要用到的不同函数的原型定义。InitializeD3D()函数用于在程序中设置和创建Direct3D。InitializeObjects()函数用于创建演示程序中要绘制在屏幕上的物体。RenderScene()函数用于在屏幕上渲染图形,而Shutdown()函数用于在程序退出时清除程序。

函数原型后面声明了一个顶点缓存对象。该顶点缓存用于保存要在屏幕上显示的几何图形数据。由于该对象使用动态内存存储数据,所以在程序退出前必须在程序的某个地方释放它。这些内存中未释放的四处浮动的对象会产生很严重的内存泄漏问题。如果有许多存储大量数据的顶点缓存,那么这个问题尤为突出。

顶点缓存后面是一个定义场景中单个3D点的结构。该点结构由位置和颜色组成。在该演示程序中,由于渲染的是白色线段,因此所有点的图案背影是白色的。以后的演示程序将介绍Direct3D所定义的3D点的其他属性。由于该演示程序只渲染线段,因此渲染场景不需要太多代码。

全局部分的最后一行代码是顶点格式标识符。该顶点格式也可称为灵活顶点格式(FVF:Flexible Vertex Format)。Direct3D通过该标识符可以知道顶点(或点)结构格式。该结构指定了顶点的位置和颜色。因此,还必须指定要处理包含坐标(D3DFVF_XYZ)和颜色(D3DFVF_DIFFUSE)的点的顶点格式。由于Direct3D不知道数据发送给它的方法,因此需要用到像FVF这样的内容,这样Direct3D才知道如何处理这些数据。

源文件中接下来的内容是消息过程MsgProc()函数、WinMain()函数和InitializeD3D()函数的实现代码。由于在笔记一和二中已经介绍过这些函数,因此此处不再介绍。这三个函数后面是InitializeObjects()函数的实现代码。如前所述,该函数将创建和设置全部要渲染的演示对象。InitializeObjects()函数的全部代码如下所示。


InitializeObjects()函数的全部代码:


[cpp]
bool InitializeObjects()
{
unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
// Fill in our structure to draw an object.
// x, y, z, color.
stD3DVertex objData[] =
{
{ 420.0f, 150.0f, 0.5f, col, },
{ 420.0f, 350.0f, 0.5f, col, },
{ 220.0f, 150.0f, 0.5f, col, },
{ 220.0f, 350.0f, 0.5f, col, },
};
// Create the vertex buffer.
if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
NULL))) return false;
// Fill the vertex buffer.
void *ptr;
if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
(void**)&ptr, 0))) return false;
memcpy(ptr, objData, sizeof(objData));
g_VertexBuffer->Unlock();
return true;
}
bool InitializeObjects()
{
unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
// Fill in our structure to draw an object.
// x, y, z, co

首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇(Visual C++)游戏开发笔记之一.. 下一篇(Visual C++)游戏开发笔记之四..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目