700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > cg实现景深效果

cg实现景深效果

时间:2019-05-26 05:31:41

相关推荐

cg实现景深效果

原链接 /myspace/item/f09e7c948170c04bf14215e2

Cg实现景深效果

景深其实就是对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程度的依据,

其算法是,当前像素的深度值与焦距的差值绝对值的平方 与 模糊程度成正比。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。