Graphenix

 
 

与我联系

  • 发短消息

搜索

 

常用链接

  • 我的随笔
  • 我的空间
  • 我的短信
  • 我的评论
  • 更多链接
  • 我的参与
  • 我的新闻
  • 最新评论
  • 我的标签

留言簿(1)

  • 给我留言
  • 查看留言

随笔档案

  • 2008年3月 (1)
  • 2008年1月 (2)
  • 2007年5月 (1)
  • 2007年4月 (3)
  • 2007年3月 (1)
  • 2007年2月 (1)
  • 2007年1月 (1)
  • 2006年10月 (11)

好友链接

  • cp的小屋

最新评论

阅读排行榜

  • 1. DeferShading + VSM + HDR + SSAO(371)
  • 2. 从3dsmax导出normalmap的时候tangent向量的“正确”算法(369)
  • 3. 关于shadowmap(270)
  • 4. Atmospheric Scattering(209)
  • 5. 图形库跟游戏引擎的小问题。(183)

评论排行榜

  • 1. ZT(2)
  • 2. volume light/light shaft/god ray(2)
  • 3. 小更新下,加了DOF(1)
  • 4. 从3dsmax导出normalmap的时候tangent向量的“正确”算法(1)
  • 5. 图,一起放算了(1)

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2008年3月30日

volume light/light shaft/god ray

试了gpugems3中的方法。

方法很简单,将一张遮挡后的明暗图做一些sample,再调整一下,add到原先的target上。有意思的是
其实我在2004年的时候就在一个项目中看到一个老外用了这种方法,当时也没放在心上,没想到现在会
出现在gpugem3上。不过这种方法其实只是近似的做了一些处理,使挡住光源的物体造成lightshaft的
效果,没有利用到深度的信息,还不是真正的“volumelight”。现在一些游戏中的效果比这个方法要高
明一些。我改进了一下,让物体不需要挡住光源也可以出现效果。

posted @ 2008-03-30 22:06 linyizsh 阅读(165) | 评论 (2) | 编辑
 

2008年1月25日

小更新下,加了DOF
posted @ 2008-01-25 21:05 linyizsh 阅读(106) | 评论 (1) | 编辑
 

2008年1月24日

DeferShading + VSM + HDR + SSAO

半年以上没有更新了,修修改改,Graphenix渲染过程。

    首先是深度pass,这个pass可以只做depth write,虽然也可以通过其它方式在lighting阶段重建某个空间中的
position来计算,不过我在这里直接输出了eyespace的position,因为后面可以省下很多力气重算位置,而且如果
拆成两个pass,速度甚至会下降。
眼空间position:


Gbuffer pass,全部在eyespace做。
normal:


deffuse:


specularcolor and power:


emissive:


    lighting阶段6个光源,一个directionallight和5个spotlight,比较耗,只计算了一个灯的阴影,使用
VSM,VSM可以产生softshadow,但是需要全部receiver也作为caster,对地形阴影计算有些不利,而且
也很难利用GBuffer来改进。

vsm texture

    lighting阶段得到source如下:


hdr pass
bright:


star:  bloom忘记抓图,算了,呵呵


tonemap放大了:


    然后是ssao,据说crytek所用的ssao有做了blur,我在这里没有做blur所以白边比较明显,实际上ssao可以在得到深度之后任何时候进行。
ssao:


最终结果:感觉还可以,反射还没有加。

posted @ 2008-01-24 22:55 linyizsh 阅读(371) | 评论 (0) | 编辑
 

2007年5月20日

CheckPoint d3d10
    最近没有做到什么实质上的东西,在研究d3d10的接口,准备对自己的简单引擎重新构架渲染库。相比起来,d10对资源的组织比d9清晰了不少,IA,VS,GS,SO,RS,PS,OM各种资源现在都围绕流水线各步骤组织和命名,并且模块化,以前用d9中我们需要花不少力气在自己的引擎中组织这些东西,相信以后的引擎对于渲染资源的组织会省下一些工夫。另外资源的重新组织也带来了一些好处,比如Texture和Sampler分开,它们之间不必再有固定联系,只是Sampler的个数仍然有所限制,不过对于单个shader代码来说,除非做bt的事,16个sampler基本上不会不足了。
    另外对于gs,可能目前第一代的dx10卡对于这部分支持还比较弱,gs的效率目前还比较差,恐怕这个以后还需要改进...呵呵,虽然特性很有吸引力。
    Shader方面,在d3d9中,d3dxeffect系统还属于辅助库的东西,其实就是hlsl的一套扩展脚本,基本上接口也比较混乱,基于常量映射和效率的问题,很多引擎仍然倾向使用基本接口,自己构造一套脚本。不过现在effect系统已经集成到核心库,而且也改进了对shader资源的访问效率,接口现在看起来比较合理一些,EffectsPool和EffectPass等的增加都是在朝方便引擎构架方面做改进。看来以后直接使用d3deffect来做shader脚本也是不错的选择(当然,对于ms的做法,既然asmshader可以考虑取消,只要能跟显卡商达成一致,那么原本的hlsl也未尝不可。。。呵呵)。
posted @ 2007-05-20 17:04 linyizsh 阅读(120) | 评论 (0) | 编辑
 

2007年4月17日

放几张美图








posted @ 2007-04-17 22:46 linyizsh 阅读(96) | 评论 (0) | 编辑
 

2007年4月1日

4.1
发完前面那个文章一看才知道是4.1号,呵呵。

顺便说句,计算机计算积分的几种方式。

如果是简单积分或者有固定值,能够得到积分后函数则最好。

另一种是画图表,然后用其他容易表示的函数来近似。

还有一种是将积分看为曲线,分段计算它的值,然后乘于各段的长度,再相加。

另外一种是展开为多项式,截项近似。

最后没办法的办法,只好做查找表。

posted @ 2007-04-01 21:26 linyizsh 阅读(71) | 评论 (0) | 编辑
 
Atmospheric Scattering
 

    以前由于硬件限制,很多游戏的天空和地面颜色主要是用贴图模拟,近来硬件的发展,越来越多的游戏开始采用基于比较真实的大气散射模型来实时计算。很多文章的计算最终都将眼睛高度和角度作为参数,这里主要按照Sean O’Neil系列的方法来。

特定波长的光的亮度公式是:

       Iv(λ) = Is(λ) * K(λ) * F(θ,g) * ∫PbPa(exp(-b/H0) * exp(-t(PPc, λ) – t(PPa, λ)))ds;

波长的影响主要由散射系数K(λ)表现,其中Is(λ)是太阳亮度,F(θ,g)是散射函数,主要有Rayleigh散射和Mie散射两种,Rayleigh散射主要是对空气中较小的粒子,主要散射较小波长的波,散射的能量对于光的入射比较对称,Mie散射主要散射空气中较大的粒子,主要散射较长的波,散射的能量在逆光部分比较少。

 


   
Rayleigh
散射的近似能量分布

 


  
较大波长的Mie散射的能量分布

一般可以用Henyey-Greenstein函数来近似以上两种散射公式,即:

       F(θ,g) = (3 * (1 – g2) * (1 + cos2θ)) / (2 * (2 + g2) * (1 + g2 – 2 * g * cosθ))3/2;

角度θ为入射光与观察点之间的夹角。g是取值常量,当为0时公式近似为Reyleigh散射,当取-0.99左右时近似为Mie散射。

    亮度公式中的积分部分

∫PbPa(exp(-b/H0) * exp(-t(PPc, λ) – t(PPa, λ)))ds;

属于比较麻烦的地方,好在积分曲线变化不是很大,所以对于积分用分段计算再取和来逼近积分的值。其中b是观察点高度在大气层中的比例,H0是大气中平均空气强度的那个高度在大气层中的比例,一般取0.25即可。t(P1P2, λ)是一个出射函数,表示光在P1P2这条路径的能量减少。公式是

       t(P1P2, λ) = 4 * π * K(λ) * ∫PbPaexp(-b/H0)ds;

Pa和Pb分别为观察点和太阳离计算的采样点最近的大气位置,如果观察点在大气中则Pa就是观察点的位置。公式中的积分称为空气的视觉深度(optical depth),以前一般用预计算查找表来进行,这样不利于在GPU计算,gpugems2中Sean O’Neil重新提出了一种方法来近似计算这个积分,他用图形观察的时候发现在观察角度固定的时候,每个高度上(从0到1)的积分值可以用地面的值(高度为0时候的值)乘于exp(-b/H0)来近似表示,对于地面上每个角度的积分值曲线是一条类似指数函数的曲线,没有很好的表示方式,Sean O’Neil自己根据图形曲线用了一条逼近的公式来计算

Scale(ξ) = H0 * exp(-0.00287 + (1 - cos *ξ)(0.459 + (1 - cos *ξ)

(3.83 + (1 - cos *ξ)(-6.80 +(1 - cos *ξ)5.25))));

式中ξ表示观察角度,0为正上方,1为正下方。

    这样全部问题就可以放到GPU中解决了,对于每个顶点首先从camera到该点(即Pa到Pb)做一些采样(次数越多越能逼近,但计算量也越大),然后对每个采样点根据角度计算Scale(ξ),再根据高度计算optical depth以及t(P1P2, λ),然后根据各段采样长度就可以计算最终的强度。

    地面颜色的计算与此类似,不过增加了一次与原颜色的混合。

           Ig(λ) = Iv(λ) + Isrc(λ) * exp(-t(PaPb, λ));


posted @ 2007-04-01 21:23 linyizsh 阅读(209) | 评论 (0) | 编辑
 

2007年3月6日

prt

    简单说下,目前是逐顶点计算,随便造的模型,顶点数比较少,效果并不好。用的是sh函数,将光照函数和传输函数分别投影到sh基函数上,得到系数,在shader中做点积,旋转采用的是《Rotation Matrices for Real Spherical Harmonics. Direct Determination by Recursion》中的方法。

posted @ 2007-03-06 22:47 linyizsh 阅读(118) | 评论 (0) | 编辑
 

2007年2月16日

ZT
    曾有魏文王问名医扁鹊说:“你们家兄弟三人,都精于医术,到底哪一位最好呢?”扁鹊答说:“长兄最好,中兄次之,我最差。”文王再问:“那么为什么你最出名呢?”扁鹊答说:“我长兄治病,是治病于病情发作之前。由于一般人不知道他事先能铲除病因,所以他的名气无法传出去,只有我们家的人才知道。我中兄治病,是治病于病情初起之时。一般人以为他只能治轻微的小病,所以他的名气只及于本乡里。而我扁鹊治病,是治病于病情严重之时。一般人都看到我在经脉上穿针管来放血、在皮肤上敷药等大手术,所以以为我的医术高明,名气因此响遍全国。”
posted @ 2007-02-16 14:38 linyizsh 阅读(82) | 评论 (2) | 编辑
 

2007年1月26日

终于正常

   搬了blog之后,荒芜了这么久。。。
   换了工作,换了城市,本想只是件小事,没想到折折腾腾,一直不得闲,到现在才可以稍微稳定下来。
   简单测试了gpu occlusion cull。按类似gg中的方法:
   渲染之前对objects进行排序。
   然后得到前一帧的结果。
   渲染时打开occlusionquery。
   如果前帧可见则绘制物体。
   如果前帧不可以见则关闭深度和颜色写入,绘制包围盒。

   结果在我自己的程序上帧数只提高了两帧。。。
   ue3也用这个方法做oc,按理不应该这么低效,不过没有仔细测试各部分时间,估计应该是在cpu方面有些瓶颈,有空再仔细测试下。

posted @ 2007-01-26 23:47 linyizsh 阅读(75) | 评论 (0) | 编辑
 
仅列出标题  下一页