Cg实现景深
来源:互联网 发布:python 函数返回true 编辑:程序博客网 时间:2024/04/29 06:01
http://www.azure.com.cn/
1.渲染深度到纹理。
相关SHADER如下:
//取得顶点的深度值,并且插值到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;
}
//将插值的深度转换成颜色
//白色越近,黑色越远。
void main(float4 inDepth : TEXCOORD0,
out float4 color : COLOR0)
{
float depthColor = inDepth.r;
color = float4(depthColor, depthColor, depthColor, 1.0);
}
以上代码讲深度转换成颜色,储存在纹理中,供景深的shader来查询。
2.景深shader
//处理景深效果
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程度的依据,
其算法是,当前像素的深度值与焦距的差值绝对值的平方 与 模糊程度成正比。
3 blur shader
uniform float gViewportInvX;
uniform float gViewportInvY;
uniform sampler2D gTexture;
float4 main(float2 texCoord : TEXCOORD0) : COLOR
{
float4 col = float4(0,0,0,0);
col+=tex2D(gTexture,texCoord + float2(-1.0*gViewportInvX ,-1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord + float2(-1.0*gViewportInvX , 1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 1.0*gViewportInvX ,-1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 1.0*gViewportInvX , 1.0*gViewportInvY)) * (1.0/16.0);
col+=tex2D(gTexture,texCoord + float2(-1.0*gViewportInvX , 0.0*gViewportInvY)) * (2.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 1.0*gViewportInvX , 0.0*gViewportInvY)) * (2.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 0.0*gViewportInvX ,-1.0*gViewportInvY)) * (2.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 0.0*gViewportInvX , 1.0*gViewportInvY)) * (2.0/16.0);
col+=tex2D(gTexture,texCoord + float2( 0.0*gViewportInvX , 0.0*gViewportInvY)) * (4.0/16.0);
return col;
}
- Cg实现景深
- cg实现景深效果
- unity中的景深效果,shader(CG)
- 景深
- 景深
- 景深
- 景深
- 景深
- 用Cg实现卡通着色
- 基于cg实现EPI渲染
- 光照模型及cg实现
- cg编程之-RayCast实现
- CG
- cg
- cg
- IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
- IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
- unity中景深(depth of field)的简单实现。。
- 浅谈apache和tomcat在linux下的整合
- 实时 Java,第 3 部分: 线程化和同步
- P2P 分发引擎协议草稿
- 象老板那样思考
- Deliver计划书
- Cg实现景深
- BT客户端源码分析
- 现在的孩子,都无法无天了-----20余网友围堵北京辱师学生乘坐汽车
- /dev/tty0和/dev/console
- BitTorrent 协议规范(翻译)
- c++学习精典
- 医生开药下手真狠
- 怎样Wii最健康
- 程序开发必备网站搜集(转载)