当前位置: 代码网 > it编程>前端脚本>Python > 从0开发游戏引擎---顶点与顶点缓存

从0开发游戏引擎---顶点与顶点缓存

2024年08月02日 Python 我要评论
在游戏中所有的模型都是通过多边形网格来逼近表示的,这些多边形可以是三角面,也可以是四边面。多边形网格是构成物体模型的基本单元。但是最终引擎识别的是三角面。点连成线,线构成面。所以顶点其实是模型最基本的单位。

顶点的概念

在游戏中所有的模型都是通过多边形网格来逼近表示的,这些多边形可以是三角面,也可以是四边面。多边形网格是构成物体模型的基本单元。但是最终引擎识别的是三角面。
点连成线,线构成面。|
所以顶点其实是模型最基本的单位。

在这里插入图片描述
在这里插入图片描述

三角面的概念

美术上:建模其实三角面四边面都可以。这个没有强制要求。每个公司规定不同。引擎上:不管你在美术上使用的什么面,最终到引擎中都是按三角面计算的面数。任何物体都可以用三角形网格来逼近表示,三角形网格是构建物体模型的基本单元。
所有物体都可以由三角形来表示。一个三角形有三个顶点,如果想在direct3d中手动创建物体的话,就需要创建构成物体的所有顶点结构。那么首先需要定义好三角形的顶点(vertex) ,三个顶点确定一个三角形,而顶点除了定义每个顶点的坐标位置以外,还含有颜色等 其他属性。当direct3d绘制图形时,将根据这些项点结构创建一一个三角形列表,来描述物体的形状和轮廓。

为什么使用三角面

在这里插入图片描述

为什么要使用顶点缓存

顶点缓存与索引缓存(vertex/index buffer)是两类相似的接口,二者所具有的方法也十分相像。一个顶点缓存是一个包含顶点数据的连续内存空间。类似的一个索引缓存是一个包含所以数据的连续内存空间。我们之所以用顶点缓存和索引缓存而非数组来存储数据,是因为
顶点缓存和索引缓存可以被放置在显存(video memmory)中。进行绘制时,使用显存中的数据将获得比使用系统内存中的数据快的多的绘制速度。
顶点缓存就是用来存储顶点的。

使用顶点缓存的步骤

设计顶点缓存格式(灵活定点格式的概念fvf)

想要使用顶点缓存绘制图形,第一步的工作就是对顶点的类型进行设计。今天我们要介绍的一套顶点格式,是固定功能流水线中使用频繁的一.套顶点定义格式-一灵活顶点格式( flexible vertex format, fvf)。需要说明的是,与灵活顶点格式对应的是可编程渲染流水线中的“顶点声明”顶点定义套路,今天我们暂时先介绍灵活顶点格式这套定义套路。

灵活顶点格式(flexible vertex format,fvf) 来描述三角形网格的每个顶点。灵活顶点格式可以让我们随心所欲地自定义其中所包含的顶点属性信息。例如,指定顶点的三维坐标、颜色、顶点法线和纹理坐标等等。
创建自定义灵活顶点格式时,根据实际的需求,需要定义一个包含特定顶点信息的结构体。主动权在我们这里,我们可以随心所欲地定义顶点包含的属性。比如我们可以定义一个只包含顶点三维坐标和颜色的结构体。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


//----------------------顶点缓存使用步骤1:设计顶点格式-----------------------//
//保存几何体的顶点缓冲区。
idirect3dvertexbuffer9 * g_vertexbuffer = null;


//自定义顶点类型的结构
struct triangled3dvertex
{
	float x, y, z, rhw;//分别是坐标和经过顶点变换的坐标
	unsigned long color;//颜色
};


//我们自定义的fvf,它描述了我们的自定义顶点结构。
#define d3dfvf_vertex (d3dfvf_xyzrhw | d3dfvf_diffuse)

创建顶点缓存

	//--------------顶点缓存使用步骤2:创建顶点缓存----------------------//
	//创建顶点缓存
	if(failed(g_d3ddevice->createvertexbuffer(sizeof(objdata), 0,d3dfvf_vertex, d3dpool_default, &g_vertexbuffer,null)))
	{
		return false;
	}

访问顶点缓存

//-------------------------------顶点缓存使用步骤3:访问顶点缓存--------------//
	//填充顶点缓存
	void *ptr;

	if(failed(g_vertexbuffer->lock(0, sizeof(objdata),(void**)&ptr, 0)))
	{
		return false;
	}

	memcpy(ptr, objdata, sizeof(objdata));

	g_vertexbuffer->unlock();

绘制

	//------------顶点缓存使用步骤4:根据顶点缓存绘制--------
	//渲染物体
	g_d3ddevice->setstreamsource(0, g_vertexbuffer, 0, sizeof(triangled3dvertex));
	g_d3ddevice->setfvf(d3dfvf_vertex);
	g_d3ddevice->drawprimitive(d3dpt_trianglelist, 0, 1);
(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com