diff --git a/qglview/renderer_deferred_shading.cpp b/qglview/renderer_deferred_shading.cpp index 82aebd8..135771a 100644 --- a/qglview/renderer_deferred_shading.cpp +++ b/qglview/renderer_deferred_shading.cpp @@ -40,6 +40,7 @@ fbo_g(5, true, GL_RGBA16F), fbo_out(3, false, GL_RGBA16F), fbo_hsmall(1, false, for (int i = 0; i < shaders.size(); ++i) *(shaders[i].second) = 0; lights_per_pass = 8; + tnoise = 0; exposure_ = 1.; df = new QWidget(); df->setLayout(new QBoxLayout(QBoxLayout::TopToBottom)); @@ -231,7 +232,21 @@ void RendererDeferredShading::renderScene() { //qDebug() << wi << ri << lms; /*wi = lri; ri = 1 - lms;*/ - + glEnable(GL_TEXTURE_1D); + if (tnoise == 0) { + glGenTextures(1, &tnoise); + glBindTexture(GL_TEXTURE_1D, tnoise); + QByteArray ba; + for (int i = 0; i < 32*3; ++i) + ba.push_back(char(random() % 256)); + //qDebug() << ba; + glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB8, 32, 0, GL_RGB, GL_UNSIGNED_BYTE, ba.constData()); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + } glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(lri)); glActiveTextureChannel(1); glBindTexture(GL_TEXTURE_2D, fbo_out.colorTexture(2)); @@ -239,16 +254,20 @@ void RendererDeferredShading::renderScene() { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glActiveTextureChannel(2); glBindTexture(GL_TEXTURE_2D, fbo_g.colorTexture(1)); + glActiveTextureChannel(3); + glBindTexture(GL_TEXTURE_1D, tnoise); shader_ssao_merge->bind(); shader_ssao_merge->setUniformValue("qgl_ModelViewProjectionMatrix", QMatrix4x4()); shader_ssao_merge->setUniformValue("z_far", GLfloat(view.depthEnd())); shader_ssao_merge->setUniformValue("z_near", GLfloat(view.depthStart())); shader_ssao_merge->setUniformValue("mat_proj", mproj); + shader_ssao_merge->setUniformValue("n0", 3); shader_ssao_merge->setUniformValue("t0", 0); shader_ssao_merge->setUniformValue("ts", 1); shader_ssao_merge->setUniformValue("tg1", 2); fbo_out.setWriteBuffer(lwi); glDrawQuad(shader_ssao_merge, corner_dirs); + glDisable(GL_TEXTURE_1D); wi = lri; ri = lwi; //piSwap(wi, ri); diff --git a/qglview/renderer_deferred_shading.h b/qglview/renderer_deferred_shading.h index 2dfd1a5..cb51fd8 100644 --- a/qglview/renderer_deferred_shading.h +++ b/qglview/renderer_deferred_shading.h @@ -49,6 +49,7 @@ private: QGLShaderProgram * shader_bloom_0, * shader_bloom_1, * shader_motion_blur, * shader_fbo_add; QGLShaderProgram * shader_shadow, * shader_ssr, * shader_ssr_blur, * shader_ssr_merge; QGLShaderProgram * shader_ssao_blur, * shader_ssao_merge; + GLuint tnoise; QVector shaders; QMatrix4x4 prev_view, prev_proj; diff --git a/qglview/shaders/ssao_blur.frag b/qglview/shaders/ssao_blur.frag index 4725972..9a42ca9 100644 --- a/qglview/shaders/ssao_blur.frag +++ b/qglview/shaders/ssao_blur.frag @@ -4,11 +4,15 @@ uniform sampler2D t0, ts, tg1; uniform float radius = 2; uniform vec2 dt; +vec4 st; + vec4 getTexel(vec2 tc, vec4 ptc, float mul) { - vec4 tv = texture(t0, tc); - if (radius == 1) + vec4 tv = texture(t0, tc), ts = texture(ts, tc); + if (radius == 1) { tv = vec4(tv.w); - return vec4(min(ptc.r, tv.r), max(ptc.g, tv.g), ptc.b + tv.b * mul, 0); + ts = tv; + } + return vec4(min(ptc.r, ts.r), max(ptc.g, ts.g), ptc.b + /*mix(tv.b, st.b, clamp(abs(st.w - tv.w), 0, 1))*/tv.b * mul, 0); } void main(void) { @@ -19,6 +23,7 @@ void main(void) { vec4 scol = texture(t0, tc); if (radius == 1) scol = vec4(scol.w); + st = scol; scol.b *= 3.; scol = getTexel(tc + dt * vec2( o, 0 ), scol, 2); scol = getTexel(tc + dt * vec2( 0, o ), scol, 2); diff --git a/qglview/shaders/ssao_merge.frag b/qglview/shaders/ssao_merge.frag index 6012e45..ae49372 100644 --- a/qglview/shaders/ssao_merge.frag +++ b/qglview/shaders/ssao_merge.frag @@ -1,6 +1,7 @@ #version 150 uniform sampler2D t0, ts, tg1; +uniform sampler1D n0; uniform float z_near, z_far; uniform mat4 mat_proj; @@ -9,7 +10,7 @@ in vec3 view_dir; void main(void) { ivec2 tc = ivec2(gl_FragCoord.xy); vec4 v0 = texelFetch(t0, tc, 0), vs = texelFetch(ts, tc, 0), vg1 = texelFetch(tg1, tc, 0); - /*vec3 n = vec3(-vg1.xy, vg1.z); + vec3 n = vec3(vg1.xyz); vec3 bn = cross(n, vec3(0, 0, 1)); vec3 bn2 = cross(n, bn); vec4 pos; @@ -17,7 +18,8 @@ void main(void) { pos.xyz = view_dir * vs.w; vec4 spos = pos, tpos, tv0; vec2 tsp; - float l = 20 * 0.5; + float sclz = dot(vec3(0,0,1), n); + /*float l = 20 * 0.5; pos.xyz += bn2 * l; for (int i = 0; i < 16; ++i) { tpos = mat_proj * pos; @@ -26,10 +28,26 @@ void main(void) { l *= 0.5; pos.xyz += bn2 * (step(pos.z, tv0.w) * 2. - 1.) * l; }*/ + /*vec3 rn; + float ss = 0.; + for (int i = 0; i < 32; ++i) { + rn = texelFetch(n0, i, 0).rgb * 2 - 1; + rn *= step(0., dot(n, rn)) * 2 - 1.; + //rn /= 10; + rn /= vs.w; + spos = pos + vec4(rn, 0); + tpos = mat_proj * spos; + tsp = -(tpos.xy / tpos.w) / 2. + 0.5; + tv0 = texture(ts, tsp); + //spos.z = tv0.w; + ss += step(-0.1, tv0.w-vs.w); + //ss += step(vs.w, tv0.w); + } + ss /= 32;*/ float minz = v0.r, maxz = v0.g, blurz = v0.b, curz = v0.w, avgz = (minz+maxz)/2; float dz = maxz - minz; - qgl_FragData[0].rgb = vec3(max(-(blurz - curz) / maxz,0.)* (curz-minz) / dz * 10); - //qgl_FragData[0].rgb = vec3(v0.b / 10); + //qgl_FragData[0].rgb = vec3(max(-(blurz - curz) / maxz,0.)* (curz-minz) / dz * 10); + qgl_FragData[0].rgb = vec3(blurz/10); //qgl_FragData[0].rgb = vec3(length(pos.z - spos.z)/15); //qgl_FragData[0].rgb = vec3(abs(v0.w/1)); }