随笔分类 -  Graphics

摘要:在Direct3D 中,雾化是通过将景物颜色与雾的颜色,以随物体到观察点距离增加而衰减的混合因子混合而实现的。两种雾化方法:顶点雾化和像素雾化。三种雾化公式:线性雾化,指数雾化,指数平方雾化。 两种雾化处理:基于深度的雾化处理和基于范围的雾化处理。基于深度是指两个点之间的深度(Z)差值,基于范围则是两点间的直线距离。Direct3D默认的是基于深度的雾化。可设置基于范围的雾化,但要先检测设备是否支持: g_pd3dDevice->GetDeviceCaps(&staps); if ( stCaps.RasterCaps &D3DPASTERCAPS_FOGRANGE ) 阅读全文
posted @ 2010-12-03 02:00 skydesign 阅读(1774) 评论(0) 推荐(0)
摘要:从实质上说,Flat是一个四边形,由两个三角形组成。将指定目标的渲染效果贴在Flat上,可实现很多种效果。本文实现的是在水底往上看的效果:把贴在水面上的纹理贴在该四边形上。先看Flat类定义: struct flat2D { float4 position; float2 uv;}; class Flat : public RenderObject { public: Flat(float2 pos,float2 size); void _Render(); void RendWire(){};~Flat(void);private: float2 m_size; float2 m_pos 阅读全文
posted @ 2010-11-28 01:44 skydesign 阅读(257) 评论(0) 推荐(0)
摘要:游戏的引擎可比作赛车的引擎,而引擎是赛车的心脏,决定着赛车的性能和稳定性,赛车的速度、操纵感这些直接与车手相关的指标都是建立在引擎的基础上的。游戏也是如此,简单地说,游戏引擎就是用于控制所有游戏功能的主程序。关于引擎架构方面,我们可以把引擎里的各个类封装成一个类库,再在客户端的项目里引入这个库文件,即可方便地调用类库里实现各个类的具体操作。一般引擎应包括哪些类了?在我做的一个渲染引擎中,有摄像机,D3D系统,声音,字体,输入系统,模型,拾取,地形,四叉树,水等,还设计了一个App类,负责场景的信息处理。可在客户端设计一App的派生类GameApp,同时把场景类Scene作为GameApp的成员 阅读全文
posted @ 2008-11-19 23:23 skydesign 阅读(318) 评论(0) 推荐(0)
摘要:LOD(levels of etails细节层次)是解决大规模地形实时渲染的一项关键技术。在地形中实现LOD技术后大大加速了地形的渲染。其基本思想是:对地形生成具有不同层次(不同分辨率)的多个版本,在绘制地形时依据视点来选择合适的层次细节进行绘制。本文用基于四叉树构建的地形来实现相关Lod算法,有关四叉树构建地形的技术可参考“引擎技术研究之地形技术”。可把全部叶子节点保存在数组Leaf,查找邻接节点时可遍历Leaf获取,可根据以下条件判断四个邻接节点:下[2]=当[0] && 下[3]=当[1]右[0]=当[1] && 右[2]=当[3]上[0]=当[2] &a 阅读全文
posted @ 2008-11-19 01:25 skydesign 阅读(664) 评论(1) 推荐(0)
摘要:阴影和纹理映射一样,通常是在渲染器中附加算法来实现,并被粘贴到场景中。在场景中每个光源产生的贴图称为阴影贴图(shadermap)。在渲染的过程中对该贴图进行存取,以找出某个像素是否位于阴影中。阴影贴图的生成原理如下图所示:可把光源模拟成有特定方向的发光点,其发出的光线与长方体相交与A点,若射穿长方体则与地面相交于B点,我们记录光线首次与物体相交的点的信息,并保存光源到该点的距离,称为该点在灯光空间的深度Depth。如此被长方体遮盖住的部分地面里的点则没有相交信息,则保存为同一光源线上首次与光源相交的点的信息为该点的Depth,如图,A点和B点保存的都是A点到光源的距离。如此场景中每个点均有D 阅读全文
posted @ 2008-10-09 23:10 skydesign 阅读(756) 评论(0) 推荐(0)
摘要:水的表面显示场景物体倒影的效果。这是把场景渲染到水面上来实现,不是简单的渲染,而要经过反射处理,即要反射渲染目标。法线贴图是可以应用到3D表面的特殊纹理,有时也称凹凸纹理,它包括了每个像素的高度值,内含许多细节的表面信息,能够在平平无奇的物体上,创建出许多种特殊的立体外形。可以把法线贴图想像成与原表面垂直的点,所有点组成另一个不同的表面。对于视觉效果而言,它的效率比原有的表面更高,若在特定位置上应用光源,可以生成精确的光照方向和反射。现具体讨论一下实现水效果的步骤:一:设计一继承模型类的water类,并为其设计一shader文件,可在其构造函数里设置相应的shader文件,在water改写模型 阅读全文
posted @ 2008-10-09 02:08 skydesign 阅读(477) 评论(0) 推荐(0)
摘要:渲染到目标,通俗地说就是把特定场景的物体放在目标上显示。这个目标可以是纹理,窗口等。本文介绍的是把场景渲染到纹理,并以图片的形式保存起来。一 其原理如下:在初始化时创建一纹理Texture,获取指向该纹理的指针,接着创建深度表面,并获取指向其的指针DepthSurface。在渲染时先获取系统的默认的渲染目标和深度模板表面,再设置Texture的表面为渲染目标,并通过DepthSurface设置深度模板表面,接着渲染场景中的物体,并保存该纹理到制定路径,最后恢复系统的默认的渲染目标和深度模板表面。二 具体步骤: 设计一渲染目标类RenderTarget,负责纹理,深度表面的创建,以及设置渲染目标 阅读全文
posted @ 2008-10-08 02:52 skydesign 阅读(545) 评论(0) 推荐(0)
摘要:Shader技术属于GPU的渲染技术,其相应语言是高级着色器语言(High Level Shader Language 简称HLSL)。HLSL主要作用为将一些复杂的图像处理快速而又有效率地在显卡上完成。在DirectX中有两种Shader,顶点着色器Vertex Shader (vs)和像素着色器Pixel Shader (ps)。能够实现VS和PS的显卡的图形处理流水线被称作为是可编程的。VS实际代替了传统图形渲染流水线里的T&L部分,其以顶点为计算单位,负责处理世界坐标中的顶点信息,可以处理光照、阴影、坐标变换、法向量等等。PS代替了传统图形渲染流水线中的光栅化部分,比如纹理贴图 阅读全文
posted @ 2008-10-07 02:49 skydesign 阅读(716) 评论(0) 推荐(0)
摘要:地形的网格可以使用高度图作为数据源生成。高度图可以是位图,可理解成二维数组,地形实际上就是一系列高度不同的网格而已,这样数组中每个元素的索引值刚好可以用来定位不同的网格(x,z),而所储存的值就是网格的高度(y)。地形的渲染可由四叉树来管理,网格的每个顶点对应四叉树的各个节点,有关四叉树的应用可参考"引擎技术研究之场景管理------四叉树与视椎剔除技术"。现讨论地形技术的相关应用:一:地形的生成1 根据一指定路径的灰度图生成高度图mpBmpHeightMap,并获取mpBmpHeightMap的长度length和宽度width2 根据length和width创建一顶点指针mpVertexsM 阅读全文
posted @ 2008-10-05 16:13 skydesign 阅读(434) 评论(0) 推荐(0)
摘要:先说一下视椎的概念:视椎是摄像机可见的空间体积,外观就像截掉顶部的金字塔。视椎剔除就是将在视锥外的物体不进行渲染操作,以加快运行速度。大型场景经常用四叉树的技术来管理,即用四叉树的方式进行空间划分。一:场景管理中四叉树的划分现以一地面为例讨论四叉树的划分技术。地面是由很多个三角形组成,两个三角形合成一正方形。如不进行四叉树划分,则需遍历所有三角形以确定被剔除物体,算法复杂度大。如下图所示:当我们用四茶树来管理物体时,可把地面看成一大正方形,将视椎的横截面与地面重合,并作第一次四等分划分,如此,对四个正方形区域作第一次遍历后,只需对视椎截面所在的上两个正方形作第二次深入遍历。如图所示:将有视椎截 阅读全文
posted @ 2008-10-04 02:42 skydesign 阅读(1363) 评论(0) 推荐(0)
摘要:------------------------pick.h------------------------#pragma once#include <vector>using std::vector;struct PickResult{DWORD dwFace; // mesh face that was intersectedFLOAT fBary1, fBary2; // barycentric coords of intersectionFLOAT fDist; // distance from ray origin to intersectionFLOAT tu, tv; 阅读全文
posted @ 2008-09-28 23:51 skydesign 阅读(592) 评论(0) 推荐(0)
摘要:渲染要进行什么操作,这随着应用技术的深入而多样化和复杂化。 一般来说,即时信息更新部分包括: 1漫游信息的更新:处理即时鼠标事件和键盘事件 由鼠标或键盘触发场景模型的平移,旋转,缩放等操作,以及摄像机的旋转,平移等。 2摄像机信息的更新:摄相机位置,朝向等信息的改变 摄像机的更新直接影响到视图矩阵和投影矩阵的实时更新 3模型信息的更新:模型位置和大小的改变以及模型的渲染 模型的平移矩阵,旋转矩阵,缩放矩阵的改变以至世界矩阵的即时更新 关于模型的渲染方面,则需处理多方面的细节:先设置渲染状态,再进行打开alpha测试,alpha裁减以及背面剔除和纹理层滤镜的设置等,接着还需设置材质和纹理等细节。 阅读全文
posted @ 2008-09-27 13:13 skydesign 阅读(337) 评论(0) 推荐(0)
摘要:几何渲染管线把顶点作为输入,可进行3种变换:世界变换,摄像机变换和投影变换,并将这些变换施展到顶点。1世界变换:一个模型的顶点要从本地坐标系统变换到世界坐标系统。世界变换包含平移,旋转,缩放的 混合变换。目的要生成世界矩阵W,可由缩放矩阵S,旋转矩阵R,平移矩阵T混合生成,一般是先放缩,再旋转,后平移,W= S * R * T. 1 平移矩阵: 通过执行函数D3DXMatrixTranslation( T , x , y , z )生成,x ,y ,z为模型在世界空间坐标。 2 缩放矩阵 通过执行函数D3DXMatrixScaling( S , x , y , z )生成,x, y, z分别 阅读全文
posted @ 2008-09-26 01:53 skydesign 阅读(1372) 评论(1) 推荐(0)
摘要:先讨论一下SDK中自带的例子:Meshes。该程序的效果是一个老虎模型绕世界坐标原点持续地旋转。程序主循环其程序流程如下:WinMain()-> InitD3D()->InitGeometry()->Render()->cleanup()其中WinMain()是程序入口,MsgProc() 处理程序的消息的回调函数,InitD3D()做程序的初始化工作InitGeometry()负责模型的加载,材质纹理的设置等,Render()负责渲染操作,在Render()中调用的SetupMatrices()设置世界矩阵,视图矩阵以及投影矩阵。在MsgProc()中调用的clean 阅读全文
posted @ 2008-09-25 14:50 skydesign 阅读(304) 评论(0) 推荐(0)