有些人非要跟我争辩什么SSAO有多难开发
- oz01其实随随便便一个山寨游戏都能做出来,烂大街的东西
而且目前正在被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) ;
- }
- chri刷出图了....
- Yuritaoz巨巨万岁!!!
- roadcross红叉*2
- itomakoto没看错吧搞这东西需要两天?lz一定是家里网速很慢下载vs用了一天半吧
- roadcross你做出来一个试试看
无论你是直接用深度渲染缓冲还是另外渲染一个Zpos浮点纹理都行 - itomakoto满世界的demo+源码还需要自己做么
稍微牛逼点点的不也是拿着别人的论文慢慢啃
天朝的码农们有跳出这个模式的? - roadcross我该怎么吐槽好呢
- PINDon't feed the troll.
- parsifal有,只不过你不认识而已