yzwalkman

——用数绘画

导航

2013年7月28日 #

Shadow Mapping 的原理与实践(二)

摘要: 3) 定义并生成Shadow Map纹理 1 texture2D Lamp0ShadowMapColor : RENDERCOLORTARGET 2 ; 7 8 sampler2D Lamp0ShadowMapSampler = sampler_state { 9 Texture = ;10 FILTER = MIN_MAG_MIP_LINEAR;11 AddressU = Clamp;12 AddressV = Clamp;13 }; 第3行的作用是使生成的Shadaow Map纹理大小与渲染窗口自动保持一致,这样可以很方便地观察到Shad... 阅读全文

posted @ 2013-07-28 09:30 yzwalkman 阅读(1914) 评论(0) 推荐(0) 编辑

2013年7月27日 #

Shadow Mapping 的原理与实践(一)

摘要: 早在上世纪七十年代末,Williams在他的“Casting Curved Shadows on Curved Surface”一文中提出了名为Shadow Map的阴影生成技术。之后,他人在此基础上针对相关问题做了许多改进。现在,Shadow Map仍被作为主流的阴影生成技术被广泛应用。 Z缓冲在一开始就是Shadow Map技术的实现基础。讨论Shadow Map技术的意义,不仅在于了解一种阴影生成技术,还在于可借此掌握一种很有用的技术手段。物体表面上一点,只有在与光源之间没有障碍阻隔时,它的深度值才会被保存到Z缓冲中。换个角度看,这就相当于,在物体表面上某点的深度值被保存到Z... 阅读全文

posted @ 2013-07-27 19:47 yzwalkman 阅读(8380) 评论(0) 推荐(1) 编辑

2013年6月21日 #

模板缓冲与阴影体

摘要: 一、模板缓冲 与模板缓冲相关的操作有两种——比较操作和更新操作。1. 比较操作 Stencil Test 比较的是Reference和Stencil Buffer中的值,公式如下: (Stencil Ref \ &mask ) op (Stencil Buffer \ &mask ) // 左右顺序不可颠倒 相应的DX和OpenGL中的命令为: glStencil(cmp_fun, ref, mask) 和 device->SetRenderState(D3DRS_STENCILFUNC, cmp_fun) 其中的cmp_fun就是上式中的“op”,实际为 “〉”、“〈” 阅读全文

posted @ 2013-06-21 22:02 yzwalkman 阅读(3683) 评论(2) 推荐(1) 编辑

2013年6月19日 #

空间变换问题的求解方法

摘要: 一、空间变换问题的求解 当用矢量来描述空间中的一点时,求解空间点变换的具体方式问题,就变成了求矩阵的问题了。对于空间中的一个刚体(Rigid-Body)或一个点来说,其空间位置的变换矩阵一般都可以由平移(Translation)矩阵和旋转(Rotation)矩阵通过变换的级联(concatenation)来得到。而平移和旋转矩阵的表达方式是现成的(实际上也是通过下面介绍的方法来推导得到的),因此在应用时,空间点的变换矩阵通过相关矩阵的连乘就可以得到,这类变换问题还是比较简单的。而对于更一般性的问题,就需要有一般性的解决方法。这里,希望通过对平面阴影的生成的讨论,能初步得到解决此类问题的一般性. 阅读全文

posted @ 2013-06-19 23:31 yzwalkman 阅读(3421) 评论(0) 推荐(0) 编辑

2013年5月29日 #

模拟光照中的凹凸纹理原理和应用

摘要: 一、一个想法 早期的3D图形渲染,是要先计算三角形各顶点的光照,然后再在光栅化阶段根据顶点光照运算结果,对整个三角面进行插值运算,从而得到整个三角形的光照效果颜色值。这种计算方式被称之为Gouraud着色(Gouraud Shading)模式。在使用DirectX9之前(包括DirectX9)的固定管线(Fixed Pipeline)图形引擎进行渲染时,用户只需要设置好相应的转换矩阵和顶点数组,就可以得到想要的结果。但Gouraud着色在表现对象的细节时就显得无能为力了,即使引入了纹理贴图,在表现一些粗糙表面时仍束手无策。因为在光栅化时,无论是三角形内部各点对应的像素纹理UV值,还是光照结果. 阅读全文

posted @ 2013-05-29 15:21 yzwalkman 阅读(3497) 评论(1) 推荐(0) 编辑

2013年2月22日 #

Ogre源代码浅析——Mesh文件结构及加载(三)

摘要: MeshSerializer::importMesh()调用的MeshSerializerImpl::importMesh()(参见:http://www.cnblogs.com/yzwalkman/archive/2013/02/21/2920277.html Mesh文件结构及加载(二)第三段代码37行)展开如下: 1 void MeshSerializerImpl::importMesh(DataStreamPtr& stream, Mesh* pMesh, MeshSerializerListener *listener) 2 { 3 // Dete... 阅读全文

posted @ 2013-02-22 12:56 yzwalkman 阅读(1996) 评论(2) 推荐(0) 编辑

2013年2月21日 #

Ogre源代码浅析——Mesh文件结构及加载(二)

摘要: Ogre中的Mesh类对应着渲染所需的模型网格,其数据来自于Mesh文件。调用SceneManager::createEntity()时,Ogre会自动创建Mesh类对象,并从指定的Mesh文件中读取相应模型数据。createEntity()将形成以下call stack。 1 SceneManager::createEntity() 2 || 3 \/ 4 5 ... ... 6 7 || 8 \/ 9 MeshManager::... 阅读全文

posted @ 2013-02-21 14:34 yzwalkman 阅读(2762) 评论(0) 推荐(0) 编辑

2013年2月20日 #

Ogre源代码浅析——Mesh文件结构及加载(一)

摘要: Ogre的模型数据(模型顶点数,每个顶点的3D坐标值等等)保存在.mesh文件中,mesh文件的结构如下(版本号:MeshSerializer_v1.8): 1 enum MeshChunkID { 2 M_HEADER = 0x1000, 3 // char* version : Version number check 4 M_MESH = 0x3000, 5 // bool skeletal... 阅读全文

posted @ 2013-02-20 16:05 yzwalkman 阅读(5818) 评论(0) 推荐(0) 编辑

2013年1月24日 #

Ogre源代码浅析——脚本及其解析(八)

摘要: Ogre脚本解析的前两个阶段——“语义分析”的准备工作和“词法分析”是在ScriptCompiler::compile(const String &str, const String &source, const String &group)函数中进行的(参见“http://www.cnblogs.com/yzwalkman/archive/2013/01/02/2841607.html 脚本及其解析(二)”的3-5行);而生成AbstractNodeList并进行相关后期处理的过程,则会在ScriptCompiler::compile(const ConcreteNo 阅读全文

posted @ 2013-01-24 14:58 yzwalkman 阅读(834) 评论(0) 推荐(0) 编辑

2013年1月20日 #

Ogre源代码浅析——脚本及其解析(七)

摘要: ScriptCompilerManager是进行脚本解析的关键类型对象(参见:http://www.cnblogs.com/yzwalkman/archive/2012/12/30/2839013.html “脚本及其解析(一)”)。ScriptCompilerManager在其构造函数中将会创建ScriptCompiler对象实例,并将对象指针赋给其mScriptCompiler成员变量。前面所说解析过程的三个阶段即是由此mScriptCompiler对象完成的。对于ScriptCompiler来说,除了前面涉及的各函数过程外,还有两块内容值得关注。一是,如下的枚举变量定义: 1 en... 阅读全文

posted @ 2013-01-20 16:35 yzwalkman 阅读(1198) 评论(0) 推荐(0) 编辑