【原创】Cg实现景深效果 

2007-12-09 21:49 发布

3506 3 0
实现方法: 景深其实就是对blur filter的一种改进,使其对每个像素的blur程度都有所不同, 而blur的依据就是场景的深度和当前焦距之间的关系。 1.渲染深度到纹理。 相关SHADER如下: //AdaptDepthVS.cg //取得顶点的深度值,并且插值到PS中去 uniform float4x4 modelViewProj : state.matrix.mvp; uniform float farclip; //远裁剪面距离 void main(float4 inPos : POSITION, out float4 oPos : POSITION, out float oDepth : TEXCOORD0) { float4 OutPos; oPos = OutPos = mul(modelViewProj, inPos); oDepth = OutPos.w / farclip; } //AdaptDepthPs.cg //将插值的深度转换成颜色 //白色越近,黑色越远。 void main(float4 inDepth : TEXCOORD0, out float4 color : COLOR0) { float depthColor = inDepth.r; color = float4(depthColor, depthColor, depthColor, 1.0); } 以上代码讲深度转换成颜色,储存在纹理中,供景深的shader来查询。 2.景深shader //DepthOfFieldPs.cg //处理景深效果 uniform sampler2D depthTex; //深度图 uniform sampler2D sceneTex; //场景渲染图 uniform float nearclip; //近裁剪面 uniform float farclip; //远裁剪面 uniform float focus; //焦距 uniform float viewPortInvX; //视口宽度的倒数 uniform float viewPortInvY; //视口高度的倒数 void main(float2 texCoord : TEXCOORD0, out float4 color : COLOR) { float4 Depthvalue = tex2D(depthTex, texCoord); //计算出真实的深度 float realDepth = nearclip + Depthvalue.r*(farclip - nearclip); //计算深度于焦距的差值 float dfocus = abs(realDepth - focus); //计算出模糊因子,距离的平方成正比 float blurFactor = 1.0-pow(-dfocus/(farclip-nearclip), 2.0); blurFactor*=2.5; color = float4(0, 0, 0, 0); color+=tex2D(sceneTex,texCoord + float2(-1.0*viewPortInvX*blurFactor ,-1.0*viewPortInvY*blurFactor)) * (1.0/16.0); color+=tex2D(sceneTex,texCoord + float2(-1.0*viewPortInvX*blurFactor , 1.0*viewPortInvY*blurFactor)) * (1.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 1.0*viewPortInvX*blurFactor ,-1.0*viewPortInvY*blurFactor)) * (1.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 1.0*viewPortInvX*blurFactor , 1.0*viewPortInvY*blurFactor)) * (1.0/16.0); color+=tex2D(sceneTex,texCoord + float2(-1.0*viewPortInvX*blurFactor , 0.0*viewPortInvY*blurFactor)) * (2.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 1.0*viewPortInvX*blurFactor , 0.0*viewPortInvY*blurFactor)) * (2.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 0.0*viewPortInvX*blurFactor ,-1.0*viewPortInvY*blurFactor)) * (2.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 0.0*viewPortInvX*blurFactor , 1.0*viewPortInvY*blurFactor)) * (2.0/16.0); color+=tex2D(sceneTex,texCoord + float2( 0.0*viewPortInvX*blurFactor , 0.0*viewPortInvY*blurFactor)) * (4.0/16.0); } 上面代码根据计算出来的blurFactor来做为blur程度的依据, 其算法是,当前像素的深度值与焦距的差值绝对值的平方 与 模糊程度成正比操作方式: F1,F2调整焦距 WSAD场景漫游 DEMO和相关代码下载(代码超乱,见谅啊 ): http://www.azure.com.cn/article.asp?id=339 需要cg.dll, cgGL.dll 的支持, 如果没有请这里下载, 并把他们复制到system32下面 [file=http://www.azure.com.cn/uploads/200507/16_174345_cglib.rar]点击下载[/file] www.azure.com.cn
B Color Smilies

全部评论3

  • summer18102
    summer18102 2007-12-16 16:46:00

    回复:【原创】Cg实现景深效果

    ★ 网一互联VPN ★ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 横空出世后,您的网络世界,将彻底只听您的 1,支持各种网络游戏,适用于国内外的各种常见网络游戏。 2,加速网络速度,减少网络延时,确保您上网的顺畅。 3,支持电信、网通、教育网、铁通、联通、移动和其它类型的宽 带用户互联互通,让您的网络游戏生涯再无地域之分! 4,随时随地使用,操作简单易用。 5,不占用系统资源 不损伤电脑硬件。 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 公司网站:http://www.w1zx.cn 客服QQ:89732951 76109329 联系电话: 0716---8111978
  • sesshoumanru
    sesshoumanru 2008-3-6 10:33:00

    回复:【原创】Cg实现景深效果

    高手阿
  • 123123123123321
    123123123123321 2008-4-24 09:22:00

    回复:【原创】Cg实现景深效果

    :2:

你可能喜欢

【原创】Cg实现景深效果 
联系
我们
快速回复 返回顶部 返回列表