(2015.07.07 新增) :开始创建3D引擎的每个步骤--从数据表示到最后的光栅化,不教怎么使用OpenGL图形API,只是检验自己是否真正的理解了3D图形学,必须知道如何手动编写类似OpenGL,这是我追求的目标:在任何计算机上编写出基于软件的3D图形引擎,在具备这种能力后,学习3D API将是小菜一碟.
教授3D图形学,而不是介绍如何使用3D图形API(opengl),理解渲染到底是怎样一个流程;理解渲染背后的数学原理
/3D图形学简介*****************************************/
/3D引擎简介************************************************************************************/
3D引擎本身就是一种软件,负责处理3D世界的数据结构(包括所有的光源,行动和常规状态信息)以及从玩家或者相机所在的视点渲染3D世界。
以模块化方式设计时,引擎将相对简单些,因为在这种情况下,3D引擎和其他游戏子系统之间的交互较少.
编写3D引擎可能犯的最大错误就是,除了3D渲染外,还让它负责完成其他的工作;eg:除了处理3D图形外,还在3D引擎代码中完成物理造型(mod
eing)工作.另外一种错误是在3D引擎中完成一些联网工作以简化网络.
waring:3D引擎只负责一项工作--根据数据进行3D渲染,仅此而已.
/************3D引擎结构篇/
1:3D图形引擎
2: game engine
3:输入系统和网络 (数据同步)
4:动画系统 (帧动画 / 骨骼动画 )
5:碰撞检测和导航系统
6:物理系统 (计算摩擦力和加速度 / 弹性碰撞检测和响应 /线性动量传递)
7:AI人工智能系统
8:3D模型和图像数据库 (3D游戏涉及的数据非常多: Entry 3D mesh / 2D纹理texture 和 光照图light map / 3D世界 /运动
与动画数据 /游戏地图数据 ) 占内存的数据,大多情况下是纹理图和光照图
waring: 来计算下 一个多边形模型的数据量(需要多少存储空间) 内存
typedef VECTOR3Dptl_TYP { float x , y ,z ;//位置 float u,v; //纹理坐标 float l; //光照值(light value) } VECTOR3Dptl , *VECTOR3Dptl_PTR;
每个顶点大约需要 24 (6 * sizeof(float)) 个字节(32bit 操作系统),entry 有200个顶点,因此 24 bit /顶点 * 200个顶点 = 480 bit
然而未考虑诸如多边形mesh 颜色等高级的数据.假设 在动画中,每种运动需要32 帧,且需要下述几种动作:
1:行走 2:奔跑 3:跳跃 4:躲闪 5:死亡 6:射击
因此总共需要 192 (6 * 32) 个运动帧; 而每个帧需要480 bit,因此总共需要 92160 (192 * 480) byte
这可是不少的内存,假设游戏中有32种动物,顶点将 占据 大约3MB (32 * 92160) 内存, 所以必须定义高效的数据结构和数据库,并根据需要 加载和卸载数据.
/************3D引擎设计篇/
3D游戏中,游戏引擎包含的内容很多,有时又几乎不涉及任何内容;然而,在大多数情况下,游戏引擎是一个处理所有事务的系统,它是一个控制
模块,向所有的子系统发出命令.
在设计初始,就应该设计一个负责游戏中一切事务的模块,将其称为"Game Engine" , 游戏引擎是一个容器,它容纳了其他所有组件,熟悉整个
系统的各个部分.
/***************************************************************************************************************************/
/3D图形学简介***********************************************************************************/
1: 3D引擎原理
2: 3D坐标引擎的结构
3: 3D坐标系统
4: 基本的3D数据结构
5: 变换和基本动画
6: 观察流水线简介
7: 3D引擎类型
8: 加载外部数据
/****************************************************************************************************************************/
/3D数据基础***************************************************************************************/
当你编写3d引擎的代码时,需要的一些函数和宏很可能我已经编写好了。
在编写软件图形引擎的时候,唯一的问题就是表示方法,即应应用3D点还是齐次4D点?我们拭目以待,但至少知道如何处理这两者.
实际上,我将使用4x3和4x4矩阵,所以从技术上来说,我将使用4D齐次点,并假设w=1或将w作为第4个分量
3DMathLib C/C++ 因为我要实现一套 3d软件渲染APi 所以重写自己的3d数学库
主要处理点,向量,直线,矩阵,四元数,参数化直线,3D平面,极坐标,柱面坐标,球面坐标和定点数
命名规则对于每个人来说都是问题,因为您希望函数有个合理的名称,但又不想输入太多的字符。
在大部分情况下,我使用类/结构名作为函数名称的一部分,加上函数功能的英文描述,并使用下划线来连接。
eg: void Mat_Mul_VECTOR3D_3X3(VECTOR3D_PTR va, MATRIX3X3_PTR mb, VECTOR3D_PTR vprod);
上述函数声明非常明确的说明了函数的功能,OpenGL采用了类似的命名规则
建立数学库
1:数学常量
2:数据结构
3:宏和内联函数
4:函数原型
5:全局变量
6:坐标系支持
7:向量支持
8:向量支持
9:矩阵支持
10:2d和3d参数化直线支持
11:3d平面支持
12:四元数支持
13:定点数支持(纯学习)
14:浮点数支持
/***************************************************************************************************************************/