摘要: Following code snippet resides in the buoyancy force generator. 1 void ParticleBuoyancy::updateForce(Particle* particle, real duration) 2 { 3 // Calculate the submersion depth. 4 real depth = particle->getPosition().y; 5 // Check if we’re out of the water. 6 if (depth >= waterHeight + ma... 阅读全文
posted @ 2014-01-09 16:59 infinityward 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 加载模型在我看来从来都不是一件容易的事情,尤其是我学习3D是从D3D入手的,模型加载直接一个函数就搞定了,对于内部细节从来都没有深入研究过。 .x文件用的比较少,所以对其理解也很肤浅。 这本书使用的渲染API是OpenGL,对于习惯使用D3D的读者来书,这可能是件比较头大的事情。在读这本书之前,我稍微补了补OpenGL的基础,发现就以经完全够用了。所以D3D党完全不用担心,更何况懂点OpenGL也不是坏事,在学点OpenGL之后,我才明白原来的自己是多么的一叶障目,因为一种API就放弃一本书,太幼稚了。1. OBJ格式解释浅析: 言归正传,我们本节介绍的是OBJ文件模型加载,本节主要加载OB. 阅读全文
posted @ 2013-12-07 05:10 infinityward 阅读(588) 评论(0) 推荐(0) 编辑
摘要: 在HLSL编译器中写的float4 pos : POSITION0,编译到asm中是dcl_position v0。看起来默认就是将:POSITION0绑定到v0了。然后重新写一段asm,在vertex stream map中使用的还是POSITION0,asm无论使用dcl_position v0还是dcl_position v1-v15,均可以正常运行。但是如果vertex stream map中使用的不是POSITION0,而是POSITION1-POSITION15,那么不管在asm中绑定到哪一个寄存器,都是黑屏,没有任何图像 输出(RenderMonkey中试验的)。 当时一直以为是 阅读全文
posted @ 2013-10-10 11:00 infinityward 阅读(792) 评论(0) 推荐(0) 编辑
摘要: Shaders for Game Programming and Artist在基础理论上并没有进行深层次挖掘,对于很多基础理论都是直接进行使用,而不讲来历。毕竟这是本讲实现的书,而非基础。如果要看基础的话,图形学的书还是强力推荐。 本书中使用的点光源,从理论上讲,应该讲叫理想点光源(Ideal point lights),因为世界上根本不存在真正的点光源。但是照明效果与现实上的点光源区别并不大,所以理想点光源模型还是有用武之地。 书中并没有解释点光源的几何衰减Attenuation的来历: 即Attenuation = 1/(A*d2 + B*d + C),也没有解释为什么方向光源没有距离. 阅读全文
posted @ 2013-09-15 10:24 infinityward 阅读(1587) 评论(0) 推荐(0) 编辑
摘要: 1. 先说体积雾:1.1) 体积雾绘制有两个让人匪夷所思的地方,一个就是渲染到renderTexture,深度缓存从32-bit浮点数pack到32-bit的A8R8G8B8,关于pack的原理及精度差异,可以在http://www.cnblogs.com/infintyward/p/3199317.html这篇文章中找到,就不再做具体解释。1.2) 体积雾的另外一个使用的很奇妙的地方就是RenderState的设置,书上描述如下:D3DRS_ALPHABLENDENABLE = TRUED3DRS_BLENDOP = ADDD3DRS_SRCBLEND = ONED3DRS_DESTBLEN 阅读全文
posted @ 2013-09-04 22:06 infinityward 阅读(425) 评论(0) 推荐(0) 编辑
摘要: 本章主要讲解的是类似于天鹅绒的材质以及如何在RenderMonkey中构建这种材质的光照方程。天鹅绒这种材质,我还是头一次听说,太孤陋寡闻了,于是乎我去认真百度了一下“天鹅绒”。这种材质反射情形如下图所示。 特点:布料的折边处非常容易看到类似于镜面高光的反射。本章的几个小程序倒是很容易搞定。值得一说的是书中双向反射分布函数(BRDF)明显有错误,跟代码对不上。如222页的图12.6所示的Oren-Nayar光照模型计算公式,这个公式是错误的。 如果看书没有勘误表,看到这种公式跟代码不一致时,真是让人死的心都有了,到底以哪一个为准? 幸好现在网络很发达,Wiki百科上有这个公式非常详细的解释。. 阅读全文
posted @ 2013-09-02 23:13 infinityward 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 本章理论非常简单,示例程序中的四个实际上真真正正跟本章主题能挂上钩的也就是反射跟折射这两个演示程序了,最后的一个程序是折射跟反射的叠加,没啥技术含量,只要反射跟折射都搞明白了,最后这个演示简直就是浮云。 背景绘制就省略了,前几章也已经练习过好多次了。 我们看看反射跟折射。 基本原理: 1. 反射——将ViewVector向量看作是反射光线,根据ViewVector,及反射点表面发现来计算入射光线,根据入射光线对CubeMap采样,作为反射点的纹理颜色。 2. 折射——将ViewVector向量看作是折射光线,根据ViewVector,及反射点表面发现来计算入射光线,根据入射光线对Cube... 阅读全文
posted @ 2013-08-26 23:35 infinityward 阅读(472) 评论(0) 推荐(0) 编辑
摘要: Render Monkey中可渲染纹理的Clear Color,可以通过双击带有""图标的可渲染纹理来设置,双击之后会弹出一个对话框: 可以对RenderTarget的Clear Color进行设置(即ARGB四个通道都可以进行"清屏"颜色设置),也可对RenderTarget的Z或者W深度进行设置。 默认的Clear Color为完全不透明黑色,即RGB通道为RGB(0,0,0),A通道为A(255)。即默认Clear Color为ARGB(255,0,0,0); 默认的Z或者W为1; 如果我设置Enable clear color,那么我可以对A通道 阅读全文
posted @ 2013-08-15 21:56 infinityward 阅读(322) 评论(0) 推荐(0) 编辑
摘要: 我们要在非浮点纹理下边实现HDR,需要将所有的浮点数可渲染纹理(前几个例子中的格式都是A16R16G16B16F)修改为A8R8B8G8,修改完之后发现,Exposure_level只能控制图像的亮度,但是Glow效果没有了。 这是因为浮点数纹理在绘制背景及茶壶时使用的如下的语句: return color * ((1.0+(color.a*64.0))* Exposure_Level); 因为浮点数纹理(A16R16G16B16F存储精度要远远大于常规纹理(A8R8B8G8),我给该颜色乘以一个 Exposure_Level,颜色亮度增加了,后边的Glow效果也增加了,但是还没有达到浮点数. 阅读全文
posted @ 2013-08-15 19:00 infinityward 阅读(308) 评论(0) 推荐(0) 编辑
摘要: 1. 我们先来看Lens FLare这个例子: 经过了这一章后边几节基本上不再有什么新的东西了,都是对前两个例子的变换。 唯一值得一提的是一个纹理缩放公式: 1 texCoord = (texCoord-0.5)*(Scale) + 0.5; 不停的对可渲染纹理中的图像进行缩放,当Scale取负值的时候,就是带符号的缩放,实际上就是就是把图像旋转了180°。 下边我们来看Vertex Shader的代码: 1 float4x4 view_proj_matrix; 2 struct VS_OUTPUT 3 { 4 float4 Pos: POSITION; 5 float2 texCo 阅读全文
posted @ 2013-08-10 18:37 infinityward 阅读(401) 评论(0) 推荐(0) 编辑
摘要: Streak演示程序中的fliter值得我们研究一下,书中描述如下: 这个fliter并不好理解,S究竟是一个什么东西?对着代码研究了半天,才发现S实际上就是采样器而已。图片中下边的文字描述,也不是很清晰,仔细看源码会发现Texcoord和weight两个公式中的S根本就不是同一个值,而是属于采样器数组的不同元素,作者真是太懒了,不把这个玩意写清楚。 根据从Demo中拷贝出来采样器代码: 1 sampler Texture0; 2 float fInverseViewportWidth; 3 float fInverseViewportHeight; 4 const float Flit... 阅读全文
posted @ 2013-08-10 11:39 infinityward 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 不得不说,这个是目前为止最为复杂的一个程序,不光是因为包含有很多的Pass,而且添加了很多的RenderTarget。每个Pass的功能倒是比较容易理解,但是要理清每个RenderTarget的功能就要费上一番功夫。因为本例中使用了7个RenderTarget(So Crazy),下面我们来说说每个RenderTarget的功能。 该程序一共使用了如图所示的RenderTarget, 其中 RenderTargetOriginal 表面大小等于ViewPort, RenderTargetSmallTemp, Glow1, Glow2, Glow2A表面大小等于128×128, Glo 阅读全文
posted @ 2013-08-08 01:33 infinityward 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 该例子与第七章的第一个示例非常相似,除了RenderTarget格式从D3DMFT_A8R8G8B8变成了D3DFMT_A16B16G16R16F,然后在绘制背景及物体的两个Pass中添加了曝光控制,其他都一样。 代码需要注意的地方,注意观察会发现绘制背景时的代码:1 sampler Texture0;2 float Exposure_level;3 4 float4 ps_main(float3 Tex : TEXCOORD0) : COLOR05 { 6 float4 color = texCUBE(Texture0,Tex);7 color = color * ((1... 阅读全文
posted @ 2013-08-07 21:40 infinityward 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 1. 我们要使用Depth Imposter功能,所以茶壶绘制阶段要使用W-buffer(是否还记得之前的DOF中物体绘制使用的W-buffer?)。 2. 然后一个要说的公式就是:1 float4 ps_main( float2 Tex : TEXCOORD0 ) : COLOR02 { 3 float2 Offset = tex3D(Texture1,float3(8*Tex.x,8*Tex.y,0));4 Offset = (2 * Offset - 1) * OffsetScale;5 return( tex2D(Texture0, Tex + Offset))... 阅读全文
posted @ 2013-08-04 10:30 infinityward 阅读(263) 评论(0) 推荐(0) 编辑
摘要: 在Render Monkey中使用CubeMap让我困扰了很长时间,请原谅我没有在DirectX的程序中学习好这个而直接跳到了这里。 这里我想说几个我当时使用CubeMap时几个疑问。我觉得用Q&A的方式来写比较好,就不用罗列不必要的东西了。 Q1:单位球不是半径为1吗?为什么茶壶半径差不多单位也为1,却始终显示在单位球体以内呢??? A1:这个是绘制单位球中关闭Z-buffer及禁止写入Z-buffer的功劳,我们把球心设置在了相机位置,这样不管我们怎样前后左右移动,球体始终是不变的,因为它随着相机的变动而变动。如果我们旋转的话,球体也会跟着旋转。关闭Z-buffer及禁止写入Z-b 阅读全文
posted @ 2013-08-04 00:37 infinityward 阅读(258) 评论(0) 推荐(0) 编辑