
业余封装3D软引擎
directx3d_beginner
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2013年9月22日星期日(序)
现在很兴奋,因为DDRAW引擎基本上封装个差不多了,而以前做过坦克大战,其实对DDRAW还是比较了解,只是没封装而已。然而,3D才是有魅力的地方。尽管学过D3D,OPENGL,VP,OSG,,但是,只是些API的调用而已,有隔靴搔痒之感,并没有真正明白什么是3D的原理,现在。开始真正去探索未知的领域了Ddraw引擎虽然还没封装完,不过基本的显示以及初步矩阵给了我灵感,并且《3D图形数学》看过两原创 2013-09-22 13:36:51 · 663 阅读 · 0 评论 -
2014年3月8日星期六(DEMO8-5恒定着色)
恒定着色是在多边形由一种材质构成。多边形的每个点的面法线都相同,因此,只需对一个顶点的像素的光照情况对整个多边形进行着色。 对于平面组成的物体,是可行的,但是如果对曲面组成的物体,会导致物体看起来由多边形组成。 在16位着色下,光照步骤为1, 计算面法线2, 对于光源列表中的每个光源,计算其光照强度3, 将所有光照强度相加4, 将结果写入到多边形颜色原创 2014-03-10 07:28:13 · 1051 阅读 · 0 评论 -
2014年3月7日星期五(DEMO8-4,实体三角形着色)
这个例子比较大,任重而道远。理论草草看了下,光记住索引和RGB各项求最小距离了。为简单起见,拷贝7-6过来,并把8-3封装到的引擎代码拷贝替换。逐行来看,各个击破先换成800*600视口#define SCREEN_WIDTH 800#define SCREEN_H原创 2014-03-10 07:24:58 · 874 阅读 · 0 评论 -
2014年3月3日星期一(DEMO8-3,ALPHA混合)
单位的电脑运行DX11时,好多问题,但是没法上网,因此,以后在家进行DX11,在单位进行软引擎,因为一是以后会有大例子,需要较长时间,二是从书上看的东西,问题的解决方法不用在网上找。大不了拷到优盘里。言归正传,进行8-3,实际上是ALPHA混合,两个源像素按照百分比相加为目标像素。Dest=src1*alpha+src2*(1-alpha);先设置3个位图,BITMAP_IMAGE原创 2014-03-10 07:23:08 · 955 阅读 · 0 评论 -
2014年3月9日星期日(DEMO8-6,画家算法)
概括说,就是先绘制离视点远的物体,再绘制离视点近的物体,这样离视点较近的物体将自动覆盖背景。可以根据渲染列表中的每个多边形的Z值,从后到前的顺序排列对于多边形较小,且不是凹的,不互相重叠,是可行的。排序是根据相机坐标进行,所以要在世界坐标系到相机坐标变换之后和相机坐标到透视坐标之前进行。 定义几个常量用来排序渲染列表中的多边形 #define SORT_POLYLI原创 2014-07-01 06:26:44 · 858 阅读 · 0 评论 -
2014年3月24日星期一(9-1GOURAUD SHADER)
第九章开头就说,核心引擎要修改和添加的代码超过15000行,因此,先开始进行吧。幸好,看了下,大部分没动。主要是进行GOURAUD着色和基本纹理映射因此,我觉得有必”?要再加个DDRAW_TEXTURE类。 //为帮助纹理应设函数分析三角形定义的常量#define TRI_TYPE_NONE原创 2014-07-01 06:47:31 · 954 阅读 · 0 评论 -
2014年7月7日星期一(DEMO8-7使用新的模型格式)
原来觉得很简单,是个控制台程序,后来发现实际上不这么简单。慢慢分析吧,先加个类,CPARSERV1,#pragmaonce #define PARSER_BUFFER_SIZE 256#define PARSER_DEFAULT_COMMENT "#"原创 2014-12-05 07:18:24 · 516 阅读 · 0 评论 -
2014年7月8日星期二(DEMO8-8加载3DSMAX ASCII格式模型.ASC)
1读取物体名,顶点数和多边形数2读取顶点列表3读取每个多边形的定义及其RGB材质颜色信息缺点是:不能指定多边形是单面还是双面的,不支持纹理映射信息和光照模型信息等,只提供了每个多边形的颜色。定义了几个值 #defineOBJECT4DV1_MAX_VERTICES 1024#defineOBJECT4DV1_MAX_POLYS原创 2014-12-05 07:20:28 · 1987 阅读 · 0 评论 -
2014年8月26日星期二(DEMO8-9加载COB模型)
步骤1读取文件开头第一行2读取名称、中心位置、X轴、Y轴和Z轴,用来定义局部矩阵3读取局部坐标到世界坐标的变换矩阵4,读取World Vertices行,并按照x,y,z顺序读取顶点列表5,读取Texture Vertices行,然后读取每个顶点的纹理坐标6,读取Face行,然后读取每个多边形面(这里用三角形面),格式为 Face verts 3 flags 标记 ma原创 2014-12-05 07:28:56 · 944 阅读 · 0 评论 -
2014年11月1日星期六(DEMO9-3模型纹理读取)
2014年11月1日星期六(DEMO9-3模型纹理读取)这一节理论很简单,无非就是纹理坐标通过插值和采样两种方式组成的。这节新加的内容就是对模型中的纹理进行了处理。voidddraw_math::Draw_Textured_TriangleFS16(POLYF4DV2_PTR face,UCHAR * _dest_buffer,int mem_pitch )原创 2014-12-05 12:13:51 · 815 阅读 · 0 评论 -
9-2加上光照计算的GOURAUD shader多边形)
9-2加上光照计算的GOURAUD shader多边形) 对于光照计算的颜色,就是考虑了法线和初始颜色。对于固定着色的多边形,将多边形的颜色复制到lit_color[0]中;对于恒定着色的多边形,计算面法线,存储在lit_color[0]; GOURAUD着色计算顶点法线,存储在lit_color{0,1,2}中。 光照计算步骤1只计算光照强度,并对顶点进行标记,以防重原创 2014-12-05 07:54:48 · 1619 阅读 · 0 评论 -
2014年11月18日星期二( DEMO9-4)
这个例子是个综合。摄像机镜头位置POINT4D cam_pos = {0,40,0,1};几个物体OBJECT4DV2 obj_tower,obj_tank, obj_marker,obj_player;设置塔和坦克的数量。及其数组 #define NUM_TOWERS 96#define原创 2016-01-10 18:24:16 · 349 阅读 · 0 评论 -
2014年11月4日星期二(DEMO10-1,3D裁剪)
本来应该进行9-4和那个RAISER3D的游戏,不过由于要进行的是软引擎,故先避免之 。直接开第十章,本节的主要内容是3D裁剪,裁剪就是尽可能少地将图元传给3D流水线的下一个阶段。首先,介绍了物体空间裁剪。定义是:根据特定的裁剪区域对基本图元组成的几何体进行裁剪,是根据对象的数学表示进行的,然后把裁剪后的多边形(这里是三角形)传给下一个阶段。问题是有可能生成新的多边形,需要重构成新的三原创 2016-01-10 18:31:46 · 722 阅读 · 0 评论 -
2014年12月4日星期四(DEMO10-2地形生成函数)
转眼间,2014年快过去了,数了数代码,封装后的代码也有17000行了,但是,还有很多工作量,继续进行最为敬畏的地形生成。这个DEMO的意思是说,加载256色位图,以位图颜色索引乘以一个缩放因子为高程,将每个单元格分割为三角形,并插入到物体的顶点列表中;当然,还要有一个彩色纹理映射到高程场上。 生成地形模式:#define POLY4DV2_ATTR_8BITCOLOR原创 2016-01-10 18:35:07 · 786 阅读 · 0 评论 -
2015年1月13日星期二(11-1深度缓存和可见性简介)
新的一年,开始新的篇章,终于进入第11章了。必须首要搞这个。争取今年搞完,我也相信,会对3D学习不是浪费时间。而是内力提升。在以前,用画家算法进行多边形排序,即根据渲染列表中的每个多边形的平均、最小或最大值进行排序,然后,再从后到前的顺序绘制多边形。大多数情况下,是正确的。但是,在多边形相互贯通、包含大小各异的几何体时,画家算法可能失效,引入Z缓存(即像素级画家算法):将对像素进行排序原创 2016-01-10 18:51:03 · 1064 阅读 · 0 评论 -
2015年1月16日星期五(12-1)
终于进入最麻烦的地方了,高级纹理映射。在这里,变换和光照计算中将使用浮点数,光栅化函数用定点数。由于函数将会爆炸性地增加,所以一个个地进行。不使用Z缓存的新光栅化函数将固定或恒定着色的多边形绘制到屏幕上,首先排序三角形再绘制void ddraw_math::Draw_Triangle_2D3_16( POLYF4DV2_PTR face,UCHAR *_dest_b原创 2016-01-10 18:54:05 · 511 阅读 · 0 评论 -
2016年1月15日(DEMO12-2ALPHA混合。)
简而言之,alpha混合就是透明度,计算Final = src1 * alpha + src2 * ( 1– alpha );分解成RGB分量同样适用。其中,src1和src2为RGB格式,长16位;混合因子:0-255,长8位。 创建alpha查找表For( 0到65535的每个颜色值) Bein 将原创 2016-01-15 10:34:50 · 481 阅读 · 0 评论 -
DEMO12-2 alpha混合
简而言之,alpha混合就是透明度,计算Final = src1 * alpha + src2 * ( 1– alpha );分解成RGB分量同样适用。其中,src1和src2为RGB格式,长16位;混合因子:0-255,长8位。 创建alpha查找表For( 0到65535的每个颜色值) Bein 将原创 2016-01-15 10:35:45 · 439 阅读 · 0 评论 -
2014年2月14日星期五(DEMO7-4,3D坦克)
先看区别:1, 相机可旋转了,上个例子是固定相机2, 进行的不是背面消除,而是物体剔除3, 渲染的不是单个物体,而是多个物体的渲染列表。列表中,是单物体多位置先看物体剔除操作,物体剔除是的位置在世界坐标系之后,在背面消除之前,即流水线目前是这样子的:模型坐标->局部坐标到世界坐标转换->世界坐标->物体消除->背面消除->世界坐标到相机坐标转换->相机坐标->投原创 2014-02-19 20:16:05 · 1174 阅读 · 4 评论 -
2014年2月7日星期五(7-3,消除了背面的3D线框立方体)
好久没进行了,看看吧,与DEMO7-2的区别,只看不同的地方,相机类型不同,归一化平面改为2*2/ar,视口为640*480,执行了背面消除,(就是判断面元向量与面元到视点向量的点乘,>0,则可见,否则,消除)这一步是在物体剔除后和世界坐标到相机坐标变换之前进行背面消除,先建立4D向量,两点确定一个向量,SO EASY如下。void ddraw_math::VECTOR4D_Bu原创 2014-02-18 12:56:28 · 1300 阅读 · 3 评论 -
2013年9月22日星期日(准备工作:分离ddraw的math和interface)
在之前,要进行下封装。好吧,先加个类,ddraw_math类吧。顺便把ddraw引擎中的几个矩阵弄到ddraw_math类中来,让接口和数学相分离开。 头文件有这些 #pragma once // a 2D vertextypedef struct VERTEX2DI_TYP { int x,y; // the原创 2013-09-22 15:17:12 · 749 阅读 · 0 评论 -
2013年9月24日星期二(demo5_1参数化2D直线)
现在很想封装下3D的,将所谓的难度踏在脚下,好,现在准备了代码到哪里,分析到哪里首先,包含各种头文件#include "common.h"#include "DDraw_Interface.h"using namespace std; HWND main_window_handle; void main(){ cout"2D Parame原创 2013-09-24 15:19:50 · 1079 阅读 · 0 评论 -
2013年9月25日星期三(demo5_2点法式平面)
所谓点法式,就是a(x-x0)+b*(y-y0)+c*(z-z0) =0;点为直线上一点(x0,y0,z0)法线为(a,b,c)初步运行EXE,发现是判断点在平面的哪个区间。先定义一个3D向量结构体//3d点和向量typedefstruct VECTOR3D_TYP{ union { floatM[3];原创 2013-09-25 21:58:08 · 766 阅读 · 0 评论 -
2013年12月30日星期一(继续流水线--局部坐标->世界坐标)
4X4矩阵相乘是很必要的,int ddraw_math::Mat_Mul_4X4( MATRIX4X4_PTR ma, MATRIX4X4_PTR mb, MATRIX4X4_PTR mprod ){ int index; for ( int row = 0; row { for( int col = 0; col原创 2013-12-31 12:23:10 · 813 阅读 · 0 评论 -
2014年1月2日星期四(流水线-UVN系统的实现)
方位角A是绕+Y轴旋转的角度,与+Z轴重叠时为0度。 仰角B是方向向量与地平面(X-Z平面)之间的夹角,假定为右手坐标系,则r= psinBy=pcosbz=rcosAx=-rsinA 初始化UVN相机,先赋值给各个朝向 void ddraw_math::VECTOR4D_INITXYZ(VECTOR4D_PTR v,float x, fl原创 2014-01-08 12:10:25 · 1005 阅读 · 0 评论 -
2013年12月5日星期四(数学)
暂时绕过浮点数等优化,直接看如何求解A*X=B,只需提供的是系数矩阵A和常量矩阵B,先求A的行列式 float ddraw_math::Mat_Det_2X2(MATRIX2X2_PTR m){ return ( m->M00 * m->M11 - m->M01 * m->M10 );} 将A复制到工作矩阵中void ddraw_math::MAT_COP原创 2013-12-28 07:57:55 · 498 阅读 · 0 评论 -
2013年12月20日星期五(7_0,16位窗口模式)
由于第6章没有例子,暂时进行第7章,进行到哪里,回过头来看第6章相应内容。发现是16位窗口模式,则先进行这个吧。,问题在window_client_x0和window_client_y0,在窗口模式不是0了,因此,可以设置setwindowclient( int x, int y);简单调整后,OK了。16位窗口原创 2013-12-28 08:00:24 · 639 阅读 · 0 评论 -
2013年12月20日星期五(7——1,绘制三角线框)
首先定义了照相机的位置和朝向POINT4D cam_pos = { 0, 0, -100, 1 };VECTOR4D cam_dir = { 0, 0, 0, 1 };先看看顶点数据结构,6.4有详细的解释,1, 用三角原创 2013-12-28 08:02:20 · 923 阅读 · 0 评论 -
2013年11月25日星期一(DEMO5-3计算参数化直线和平面交点)
今天,以3D为主,仍然一步步地进行。首先加了个3D参数化直线,类似于参数化2D直线。 //参数化D直线typedef struct PARMLINE3D_TYP{ POINT3D p0; //起点 POINT3D p1; //终点 VECTOR3D v;原创 2013-12-27 18:49:01 · 725 阅读 · 0 评论 -
2013年11月26日星期二(四元数)
这一节 ,应该是个一点点进行QUAT q1={0,0,0,0},先看下QUAT数据类型//四元数typedef struct QUAT_TYP{ union { float M[4]; struct { flo原创 2013-12-28 07:56:36 · 794 阅读 · 0 评论 -
2014年1月14日(DEMO7-2,加载PLG)
2014年1月14日星期二(DEMO7-2,加载3D线框立方体物体模型)上个DEMO,是渲染列表,这个DEMO,进行了加载PLG模型,仍然是一步步地进行。PLG模型首行包含了物体名称、顶点数和多边形数3部分组成。加载模型时可以每次读取一行,并对其中的数字进行分析。 现在开始进行代码。先设置摄像机坐标和位置,朝向,放缩比例,这里用的是物体,不是渲染列表。 // ini原创 2014-01-26 07:08:42 · 909 阅读 · 0 评论 -
2014年1月3日星期五(DEMO7_1终结)
下面将渲染列表从世界坐标系—>摄像机坐标系 void ddraw_liushuixian::World_To_Camera_RENDERLIST4DV1( ddraw_math math, RENDERLIST4DV1_PTR rend_list, CAM4DV1_PTR cam){ for( int poly = 0; poly num_polys; poly++ )原创 2014-01-17 14:28:39 · 721 阅读 · 0 评论 -
2014年1月14日星期二(DEMO7-2,加载3D线框立方体物体模型)
上个DEMO,是渲染列表,这个DEMO,进行了加载PLG模型,仍然是一步步地进行。PLG模型首行包含了物体名称、顶点数和多边形数3部分组成。加载模型时可以每次读取一行,并对其中的数字进行分析。 现在开始进行代码。先设置摄像机坐标和位置,朝向,放缩比例,这里用的是物体,不是渲染列表。 // initialize camera position and direction原创 2014-01-20 05:25:48 · 836 阅读 · 0 评论 -
2014年2月20日星期四(DEMO7-5)
这个DEMO与上个DEMO的区别在于1, 相机是UVN相机,而不是欧拉相机,变成全屏的了。没有2. UVN相机模型,就是在知道准确坐标的时候进行聚焦。欧拉相机是知道大概方向时的扫描。其中,N是指相机位置指向目标位置的向量,相当于Z轴;V指的是上向量,相当于Y轴,假设v=;接着求U,U相当于右向量X,计算方法是U=V×N,接着计算V的正确值V=N×U。可见,U,V,N三向原创 2014-02-20 21:02:03 · 779 阅读 · 0 评论 -
2014年2月21日星期五(DEMO7-6战区漫步)
这是本章最后一个例子,与上个例子不同的是;1, 加载的物体是2个2, 用了欧拉相机,视野120度这个DEMO是个综合,应该没有新的函数了,稍微简单些。首先设定个宇宙空间,以及 各物体参数 #define UNIVERSE_RADIUS原创 2014-02-22 07:59:03 · 756 阅读 · 0 评论 -
2014年2月22日星期六(DEMO8-1,颜色与放缩系数相乘)
终于进入纹理和光照部分了,我在网上看到有些人说这本书过时了,其实不然,SHADER也就是把这些东西怎么揉合在一起,而具体怎么揉合,这本书写的很清楚,可以说是力量之源。 这个DEMO主要是说颜色调制,就是RGB各项相乘,颜色与分量相成,不超过255 if ( ( ri = ( float ) ri * scalef ) > 255) {原创 2014-02-25 22:07:16 · 1081 阅读 · 0 评论 -
2014年2月25日星期二(DEMO8-2,光照图调制)
粗略看了下,这个DEMO加上了个光照图,首先定义了个灯光数量,#define NUM_LAMP 4以及光照图数组BITMAP_IMAGE lightmaps[NUM_LAMP]; 初始化时,位置不同了{ bitmap->Cre原创 2014-02-26 13:51:35 · 667 阅读 · 0 评论