{"id":1497,"date":"2011-09-30T00:10:42","date_gmt":"2011-09-29T16:10:42","guid":{"rendered":"http:\/\/www.hyzgame.com.cn\/?p=1497"},"modified":"2011-09-30T00:10:42","modified_gmt":"2011-09-29T16:10:42","slug":"%e4%b8%80%e6%ae%b5%e8%af%9d%e7%9a%84ssao%ef%bc%8c%e5%9c%a8irrlicht%e8%ae%ba%e5%9d%9b%e4%b8%8a%e7%9c%8b%e5%88%b0%e7%9a%84","status":"publish","type":"post","link":"http:\/\/www.hyzgame.com\/?p=1497","title":{"rendered":"\u4e00\u6bb5\u8bdd\u7684SSAO\uff0c\u5728IrrLicht\u8bba\u575b\u4e0a\u770b\u5230\u7684"},"content":{"rendered":"<p><code>\"uniform sampler2D tex0;\"\\<\/p>\n<p>\"uniform sampler2D tex2;\"\\<\/p>\n<p>\"uniform vec2 screenSz;\"\\<br \/>\n\"uniform float camFar;\"\\<br \/>\n\"float rand(vec2 co){\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * vec2(43758.5453,43458.5734));\"\\<br \/>\n\"}\\n\"\\<br \/>\n\"#define smplsz 7.05\\n\"\\<br \/>\n\"#define jitter 8.95\\n\"\\<br \/>\n\"#define range 10.0\\n\"\\<br \/>\n\"#define gi_scale 6.85\\n\"\\<br \/>\n\"#define ao_scale 1.55\\n\"\\<br \/>\n\"#define gi_mul_ao 0.45\\n\"\\<br \/>\n\"void main() {\"\\<br \/>\n\"\u00a0 \u00a0vec2 UV = gl_TexCoord[0].xy;\"\\<br \/>\n\"\u00a0 \u00a0vec2 sample3 = texture2D(tex2,UV).xy;\"\\<br \/>\n\"\u00a0 \u00a0if (sample3.x==1.0)\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0discard;\"\\<br \/>\n\"\u00a0 \u00a0float mult = camFar\/range;\"\\<br \/>\n\"\u00a0 \u00a0vec4 col = texture2D(tex0,UV);\"\\<br \/>\n\"\u00a0 \u00a0col.w = col.w*2.0-1.0;\"\\<br \/>\n\"\u00a0 \u00a0vec3 n = vec3(col.w,sample3.y,sqrt(max((1.0-sample3.y*sample3.y-col.w*col.w),0.0)));\"\\<br \/>\n\"\u00a0 \u00a0vec3 p = (vec3(UV*2.0-1.0,1.0)*sample3.x*mult);\"\\<br \/>\n\"\u00a0 \u00a0vec2 fres = UV*screenSz*vec2(5.0\/128.0);\"\\<br \/>\n\"\u00a0 \u00a0vec2 jitterSz = jitter\/screenSz;\"\\<br \/>\n\"\u00a0 \u00a0float ao = 0.0;\"\\<br \/>\n\"\u00a0 \u00a0vec3 gi = vec3(0.0,0.0,0.0);\"\\<br \/>\n\"\u00a0 \u00a0vec2 inc = vec2(smplsz)\/screenSz;\"\\<br \/>\n\"\u00a0 \u00a0vec2 UVoff;\"\\<br \/>\n\"\u00a0 \u00a0float Adiv = 4.0\/(screenSz.x*screenSz.y);\"\\<br \/>\n\"\u00a0 \u00a0for(float i=1.0; i&lt;4.0; ++i) {\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0float samples = i*3.0;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0for(float j=0.0; j&lt;samples; ++j) {\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float angle = j*6.283185308\/samples;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0UVoff = clamp(UV+vec2(sin(angle),cos(angle))*i*inc+rand(fres+UVoff)*jitterSz,0.000386,0.999614);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0vec2 sample4 = texture2D(tex2, UVoff).rg;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float sampleDepth = mult*sample4.r;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0vec3 ddiff = vec3(UVoff*2.0*sampleDepth-vec2(sampleDepth),sampleDepth)-p;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float rd = dot(ddiff,ddiff)*3.141592654;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0ddiff = normalize(ddiff);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0vec4 colSmp = texture2D(tex0,UVoff);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0colSmp.w = colSmp.w*2.0-1.0;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0vec3 nmlE = vec3(colSmp.w,sample4.y,sqrt(max((1.0-sample4.y*sample4.y-colSmp.w*colSmp.w),0.0)));\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float A = sampleDepth*sampleDepth*Adiv;\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float cosE = max(dot(nmlE,-ddiff),0.0);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0float cosR = dot( n,ddiff );\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0ao += cosE*max(cosR*4.0,0.0)\/sqrt(A\/rd + 1.0);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0gi += colSmp.rgb*max(cosR,0.0)*cosE*(A\/rd+1.0);\"\\<br \/>\n\"\u00a0 \u00a0 \u00a0 \u00a0}\"\\<br \/>\n\"\u00a0 \u00a0}\"\\<br \/>\n\"\u00a0 \u00a0ao *= ao_scale\/30.0;\"\\<br \/>\n\"\u00a0 \u00a0gi *= gi_scale\/30.0;\"\\<br \/>\n\"\u00a0 \u00a0gl_FragColor = vec4((col.rgb+gi*gi_mul_ao)*vec3(max(-pow(ao,0.936),-1.0))+col.rgb+gi,1.0);\"\\<br \/>\n\"}\"<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;uniform sampler2D tex0;&#8221;\\ &#8220;uniform sampler2D tex2;&#8221;\\ &#8221; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1497","post","type-post","status-publish","format-standard","hentry","category-1"],"_links":{"self":[{"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/posts\/1497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1497"}],"version-history":[{"count":1,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/posts\/1497\/revisions"}],"predecessor-version":[{"id":1498,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=\/wp\/v2\/posts\/1497\/revisions\/1498"}],"wp:attachment":[{"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1497"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.hyzgame.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}