人气 163

[游戏程序] 【原创】Cg实现景深效果 [复制链接]

九艺网 2017-3-10 17:00:45

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x

                               
登录/注册后可看大图
实现方法:景深其实就是对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
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-5-11 01:21 , Processed in 0.120878 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.