有些人非要跟我争辩什么SSAO有多难开发

  • o
    oz01
    其实随随便便一个山寨游戏都能做出来,烂大街的东西
    而且目前正在被HBAO和HDAO取代
    下面这是我用了2天时间随便搞的
    左边开启SSAO,右边未开启SSAO


    SSAO像素着色器代码:
    1. #version 110
    2. #extension GL_ARB_texture_rectangle : enable
    3. uniform vec4 SSAOSet;
    4. uniform sampler2DRect SSAOTex;
    5. float readDepth( in vec2 coord ) {
    6. return SSAOSet.z/( 1.0- texture2DRect( SSAOTex, coord ).x * ( SSAOSet.w - SSAOSet.z ) /SSAOSet.w);
    7. }
    8. float cDepths( in float depth1, in float depth2, in float depthm ,in float bais)
    9. {
    10. float aoo= min(1.0,max(0.0,-(depth1+depth2-depthm*2.0)-0.5));
    11. aoo*=min(1.0,max(0.0,3.0*bais-abs(depth1-depth2)));
    12. return aoo;
    13. }
    14. void main(void)
    15. {
    16. vec2 texCoord=gl_FragCoord.xy;
    17. float depth = readDepth( texCoord );
    18. float depthMAX=SSAOSet.z/( 1.0- ( SSAOSet.w - SSAOSet.z ) /SSAOSet.w);
    19. float pw = 1.0 ;
    20. float ph = 1.0 ;
    21. float aoscale=1.0;
    22. float dp1;
    23. float dp2;
    24. float aod = 0.0;
    25. float dpbais = 2.0;
    26. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
    27. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
    28. aod+=cDepths(dp1,dp2,depth,dpbais);
    29. dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
    30. dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
    31. aod+=cDepths(dp1,dp2,depth,dpbais);
    32. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
    33. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
    34. aod+=cDepths(dp1,dp2,depth,dpbais);
    35. dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
    36. dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
    37. aod+=cDepths(dp1,dp2,depth,dpbais);
    38. pw*=2.0;
    39. ph*=2.0;
    40. dpbais+=1.0;
    41. aoscale*=1.15;
    42. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
    43. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
    44. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    45. dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
    46. dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
    47. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    48. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
    49. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
    50. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    51. dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
    52. dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
    53. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    54. pw*=2.0;
    55. ph*=2.0;
    56. dpbais+=1.0;
    57. aoscale*=1.15;
    58. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
    59. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
    60. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    61. dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
    62. dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
    63. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    64. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
    65. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
    66. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    67. dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
    68. dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
    69. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    70. pw*=2.0;
    71. ph*=2.0;
    72. dpbais+=1.0;
    73. aoscale*=1.15;
    74. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y+ph));
    75. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y-ph));
    76. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    77. dp1=readDepth( vec2(texCoord.x-pw,texCoord.y+ph));
    78. dp2=readDepth( vec2(texCoord.x+pw,texCoord.y-ph));
    79. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    80. dp1=readDepth( vec2(texCoord.x+pw,texCoord.y));
    81. dp2=readDepth( vec2(texCoord.x-pw,texCoord.y));
    82. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    83. dp1=readDepth( vec2(texCoord.x,texCoord.y+ph));
    84. dp2=readDepth( vec2(texCoord.x,texCoord.y-ph));
    85. aod+=cDepths(dp1,dp2,depth,dpbais)/aoscale;
    86. if(depthMAX*0.225<depth)
    87. aod=0.0;
    88. gl_FragColor = vec4(0.0,0.0,0.0,aod/16.0) ;
    89. }
    复制代码
  • c
    chri
    刷出图了....
  • Y
    Yurita
    oz巨巨万岁!!!
  • r
    roadcross
    红叉*2
  • i
    itomakoto
    没看错吧搞这东西需要两天?lz一定是家里网速很慢下载vs用了一天半吧
  • r
    roadcross
    你做出来一个试试看
    无论你是直接用深度渲染缓冲还是另外渲染一个Zpos浮点纹理都行
  • i
    itomakoto
    满世界的demo+源码还需要自己做么
    稍微牛逼点点的不也是拿着别人的论文慢慢啃
    天朝的码农们有跳出这个模式的?
  • r
    roadcross
    我该怎么吐槽好呢
  • P
    PIN
    Don't feed the troll.
  • p
    parsifal
    有,只不过你不认识而已