貌似读这本书的人比较少,最近正好在看,就记下自己看书时遇到的难点和写代码时犯的错误。
Chapter 9-May There Be Light之点光源及其衰减
摘要:Shaders for Game Programming and Artist在基础理论上并没有进行深层次挖掘,对于很多基础理论都是直接进行使用,而不讲来历。毕竟这是本讲实现的书,而非基础。如果要看基础的话,图形学的书还是强力推荐。 本书中使用的点光源,从理论上讲,应该讲叫理想点光源(Ideal point lights),因为世界上根本不存在真正的点光源。但是照明效果与现实上的点光源区别并不大,所以理想点光源模型还是有用武之地。 书中并没有解释点光源的几何衰减Attenuation的来历: 即Attenuation = 1/(A*d2 + B*d + C),也没有解释为什么方向光源没有距离.
阅读全文
posted @
2013-09-15 10:24
infinityward
阅读(1937)
推荐(0)
Chapter 15-Watch Out for That Morning Fog之体积雾及体积雾场景混合
摘要: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
阅读(513)
推荐(0)
Chapter 12-Not All Materials Are the Same
摘要:本章主要讲解的是类似于天鹅绒的材质以及如何在RenderMonkey中构建这种材质的光照方程。天鹅绒这种材质,我还是头一次听说,太孤陋寡闻了,于是乎我去认真百度了一下“天鹅绒”。这种材质反射情形如下图所示。 特点:布料的折边处非常容易看到类似于镜面高光的反射。本章的几个小程序倒是很容易搞定。值得一说的是书中双向反射分布函数(BRDF)明显有错误,跟代码对不上。如222页的图12.6所示的Oren-Nayar光照模型计算公式,这个公式是错误的。 如果看书没有勘误表,看到这种公式跟代码不一致时,真是让人死的心都有了,到底以哪一个为准? 幸好现在网络很发达,Wiki百科上有这个公式非常详细的解释。.
阅读全文
posted @
2013-09-02 23:13
infinityward
阅读(344)
推荐(0)
Chapter 11-Mirror, Mirror, On the Wall之反射跟折射
摘要:本章理论非常简单,示例程序中的四个实际上真真正正跟本章主题能挂上钩的也就是反射跟折射这两个演示程序了,最后的一个程序是折射跟反射的叠加,没啥技术含量,只要反射跟折射都搞明白了,最后这个演示简直就是浮云。 背景绘制就省略了,前几章也已经练习过好多次了。 我们看看反射跟折射。 基本原理: 1. 反射——将ViewVector向量看作是反射光线,根据ViewVector,及反射点表面发现来计算入射光线,根据入射光线对CubeMap采样,作为反射点的纹理颜色。 2. 折射——将ViewVector向量看作是折射光线,根据ViewVector,及反射点表面发现来计算入射光线,根据入射光线对Cube...
阅读全文
posted @
2013-08-26 23:35
infinityward
阅读(507)
推荐(0)
Chapter8-Making Your Day Brighter之Lens Flare & put all together
摘要: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
阅读(436)
推荐(0)
Chapter8-Making Your Day Brighter之The Streak
摘要: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
阅读(236)
推荐(0)
Chapter8-Making Your Day Brighter之Your First HDR Shader: The Glare!
摘要:不得不说,这个是目前为止最为复杂的一个程序,不光是因为包含有很多的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
阅读(424)
推荐(0)
Chapter8-Making Your Day Brighter之Exposure Control
摘要:该例子与第七章的第一个示例非常相似,除了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
阅读(319)
推荐(0)
Chapter 7-It’s Getting Hot in Here之Heat Haze
摘要: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
阅读(312)
推荐(0)
Chapter 7-It’s Getting Hot in Here之Cube Map
摘要:在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
阅读(287)
推荐(0)
Chapter 6-Blurring Things Up之Do It Twice
摘要:我们跟Using the Alpha Channel进行一下对比: 1. Using Alpha Channel这个例子中,物体的深度直接在物体绘制的Vertex Shader中计算出来,然后route到Pixel Shader中,再在Pixel Shader利用景深计算公式(公式自变量就是深度)1 float Blur = max(clamp(0,1, 1 - (Depth-Near_Dist)/Near_Range),2 clamp(0,1,(Depth-(Far_Dist-Far_Range))/Far_Range)); 再进一步将Blu...
阅读全文
posted @
2013-07-18 21:38
infinityward
阅读(293)
推荐(0)
Chapter 6-Blurring Things Up之Using Alpha Channel
摘要:该方法将物体绘制到RT时,和上一例子(depth imposter)仅有一个细微的差别,就是将W-buffer计算出来,保存到物体绘制RT的Alpha通道中,这里我们不讲解如何存储到Alpha通道,将重点放在如何根据深度计算Blur Amount 书中有一个计算Blur Amount的算法: float Blur = max(clamp(0,1, 1 - (Depth-Near_Dist)/Near_Range), clamp(0,1, (Depth-(Far_Dist-Far_Range))/Far_Range)); 当时我看了半天也没看明白这个...
阅读全文
posted @
2013-07-17 00:24
infinityward
阅读(241)
推荐(0)
Chapter 6-Blurring Things Up之Depth Imposter
摘要:这是本书中第一个实战实例,使用的是depth imposter方法来实现的Depth of view(景深),不过这个实现方法有一个缺点,就是模糊跟清晰的过渡太过明显,很容易就能看出来有一个分割平面将物体分成了模糊与清晰的两部分(书中截图不是很清晰,我多截了几张比较清晰的分割面)。 关于算法上边,没有什么好说的,要说的就是ImposterFar Pass和ImposterNear Pass中的State Block设置时应该注意的问题。在这个实例中,我们用到了三个可渲染纹理(Renderable Texture,下文简称RT),其中一个用于物体渲染(即Render Target),另外两个..
阅读全文
posted @
2013-07-16 23:51
infinityward
阅读(295)
推荐(0)
Chapter 5-Looking Through a Filter(如何将纹理坐标变换到屏幕坐标)
摘要:本章主要目标讲的是过滤与模糊,要用到的一个比较常见的功能就是Render to texture。 RenderMonkey中直接可以添加可渲染纹理,我们要做的就是完成如何渲染到纹理的代码。 书中有一段代码如下: 1 float4x4 view_proj_matrix; 2 float viewport_inv_width; 3 float viewport_inv_height; 4 struct VS_OUTPUT 5 { 6 float4 Pos: POSITION; 7 float2 texCoord: TEXCOORD0; 8 }; 9 VS_OUTPUT vs_main(floa..
阅读全文
posted @
2013-06-28 16:48
infinityward
阅读(3386)
推荐(0)