有些人非要跟我争辩什么SSAO有多难开发
其实随随便便一个山寨游戏都能做出来,烂大街的东西而且目前正在被HBAO和HDAO取代
下面这是我用了2天时间随便搞的
左边开启SSAO,右边未开启SSAO
SSAO像素着色器代码:
#version 110
#extension GL_ARB_texture_rectangle : enable
uniform vec4 SSAOSet;
uniform sampler2DRect SSAOTex;
float readDepth( in vec2 coord ) {
return SSAOSet.z/( 1.0- texture2DRect( SSAOTex, coord ).x * ( SSAOSet.w - SSAOSet.z ) /SSAOSet.w);
}
float cDepths( in float depth1, in float depth2, in float depthm ,in float bais)
{
float aoo= min(1.0,max(0.0,-(depth1+depth2-depthm*2.0)-0.5));
aoo*=min(1.0,max(0.0,3.0*bais-abs(depth1-depth2)));
return aoo;
}
void main(void)
{
vec2 texCoord=gl_FragCoord.xy;
float depth = readDepth( texCoord );
float depthMAX=SSAOSet.z/( 1.0- ( SSAOSet.w - SSAOSet.z ) /SSAOSet.w);
float pw = 1.0 ;
float ph = 1.0 ;
float aoscale=1.0;
float dp1;
float dp2;
float aod = 0.0;
float dpbais = 2.0;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais);
dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais);
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
aod+=cDepths(dp1,dp2,depth,dpbais);
dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais);
pw*=2.0;
ph*=2.0;
dpbais+=1.0;
aoscale*=1.15;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
pw*=2.0;
ph*=2.0;
dpbais+=1.0;
aoscale*=1.15;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
pw*=2.0;
ph*=2.0;
dpbais+=1.0;
aoscale*=1.15;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
if(depthMAX*0.225<depth)
aod=0.0;
gl_FragColor = vec4(0.0,0.0,0.0,aod/16.0) ;
} 刷出图了.... oz巨巨万岁!!! 红叉*2 没看错吧搞这东西需要两天?lz一定是家里网速很慢下载vs用了一天半吧 引用第4楼itomakoto于2011-11-17 14:44发表的:
没看错吧搞这东西需要两天?lz一定是家里网速很慢下载vs用了一天半吧 images/back.gif
你做出来一个试试看
无论你是直接用深度渲染缓冲还是另外渲染一个Zpos浮点纹理都行
页:
[1]