游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11442|回复: 7

【原创】Cg实现景深效果

[复制链接]

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-5-15 18:38:00 | 显示全部楼层 |阅读模式
原文地址:
http://www.azure.com.cn/article.asp?id=339

如有转载,请注明:
http://www.azure.com.cn/



实现方法:
景深其实就是对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和相关代码下载(代码超乱,见谅啊 [em17]):
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

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-5-15 19:05:00 | 显示全部楼层

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

good !!  up!~~~

3

主题

50

帖子

50

积分

注册会员

Rank: 2

积分
50
发表于 2007-5-15 20:44:00 | 显示全部楼层

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

---------------------------
ERROR
---------------------------
Failed to initialize pixel shader! Hardware doesn't support any of the required pixel shading extensions!
---------------------------
确定   
---------------------------

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-5-15 21:31:00 | 显示全部楼层

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

你那显卡,扔了吧。

36

主题

197

帖子

197

积分

注册会员

Rank: 2

积分
197
发表于 2007-5-16 11:07:00 | 显示全部楼层

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

为什么近处的人脑袋有一层模糊呢。。。很不爽阿

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
 楼主| 发表于 2007-5-16 11:34:00 | 显示全部楼层

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

我估计的深度图的精度不够,还需要稍微改进下。

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2007-5-16 11:48:00 | 显示全部楼层

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

Devil: Re:【原创】Cg实现景深效果

你那显卡,扔了吧。


典型的欧美游戏作风[em10]

0

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
QQ
发表于 2007-6-4 17:33:00 | 显示全部楼层

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

nVIDIA 自带的例子里面有........ .
为什么自己写[em24]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 06:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表