From f011016d94fe7481de127690544299b48fa57783 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Tue, 19 Feb 2013 05:56:28 +0200 Subject: [PATCH] smaa move mask fixes --- data/smaa.cfg | 8 +++++-- src/engine/aa.cpp | 2 +- src/engine/engine.h | 2 ++ src/engine/rendergl.cpp | 20 ++++++++++++++++ src/engine/renderlights.cpp | 48 ++++++++++++++++++------------------- src/engine/shader.cpp | 7 +----- 6 files changed, 54 insertions(+), 33 deletions(-) diff --git a/data/smaa.cfg b/data/smaa.cfg index f21f025..ef2cce3 100644 --- a/data/smaa.cfg +++ b/data/smaa.cfg @@ -218,6 +218,10 @@ shader 0 [SMAABlendingWeightCalculation@smaapreset@smaaopts] [ // We will use these offsets for the searches later on (see PSEUDO_GATHER4): gl_TexCoord[1] = gl_MultiTexCoord0.xyxy + vec4(-0.25, -0.125, 1.25, -0.125); gl_TexCoord[2] = gl_MultiTexCoord0.xyxy + vec4(-0.125, -0.25, -0.125, 1.25); + + @(if (smaaopt "m") [result [ + gl_TexCoord[3].xy = gl_MultiTexCoord1.xy; + ]]) } ] [ #extension GL_ARB_texture_rectangle : enable @@ -448,9 +452,9 @@ shader 0 [SMAABlendingWeightCalculation@smaapreset@smaaopts] [ vec2 e = texture2DRect(tex0, gl_TexCoord[0].xy).rg; @(if (smaaopt "m") [result [ - float mask = step(texture2DRect(tex3, gl_TexCoord[0].xy).r, 0.75); // inverted mask, 0 means moving, 1 means static + float mask = step(texture2DRect(tex3, gl_TexCoord[3].xy).r, 0.25); // inverted mask, 0 means moving, 1 means static ]] [result [ - #define mask 0.0 + #define mask 1.0 ]]) if (e.g > 0.0) { // Edge at north diff --git a/src/engine/aa.cpp b/src/engine/aa.cpp index 77596d3..0276683 100644 --- a/src/engine/aa.cpp +++ b/src/engine/aa.cpp @@ -684,7 +684,7 @@ void dosmaa(GLuint outfbo = 0, bool split = false) glBindTexture(GL_TEXTURE_RECTANGLE_ARB, tqaamasktex); } glActiveTexture_(GL_TEXTURE0_ARB); - screenquad(vieww, viewh); + screenquadoffset(0, 0, vieww, viewh, -0.5f/(1<>tqaamovemaskreduce, viewh>>tqaamovemaskreduce); if(smaadepthmask) { glDisable(GL_DEPTH_TEST); diff --git a/src/engine/engine.h b/src/engine/engine.h index 248d626..7c5ff1d 100644 --- a/src/engine/engine.h +++ b/src/engine/engine.h @@ -148,6 +148,8 @@ extern int pushscissor(float sx1, float sy1, float sx2, float sy2); extern void popscissor(); extern void screenquad(float sw, float sh); extern void screenquad(float sw, float sh, float sw2, float sh2); +extern void screenquadoffset(float x, float y, float w, float h); +extern void screenquadoffset(float x, float y, float w, float h, float x2, float y2, float w2, float h2); extern void recomputecamera(); extern void findorientation(); extern float calcfrustumboundsphere(float nearplane, float farplane, const vec &pos, const vec &view, vec ¢er); diff --git a/src/engine/rendergl.cpp b/src/engine/rendergl.cpp index 18742ed..4fc8cda 100644 --- a/src/engine/rendergl.cpp +++ b/src/engine/rendergl.cpp @@ -1579,6 +1579,26 @@ void screenquad(float sw, float sh, float sw2, float sh2) glEnd(); } +void screenquadoffset(float x, float y, float w, float h) +{ + glBegin(GL_TRIANGLE_STRIP); + glTexCoord2f(x + w, y); glVertex2f(1, -1); + glTexCoord2f(x, y); glVertex2f(-1, -1); + glTexCoord2f(x + w, y + h); glVertex2f(1, 1); + glTexCoord2f(x, y + h); glVertex2f(-1, 1); + glEnd(); +} + +void screenquadoffset(float x, float y, float w, float h, float x2, float y2, float w2, float h2) +{ + glBegin(GL_TRIANGLE_STRIP); + glMultiTexCoord2f_(GL_TEXTURE0_ARB, x+w, y); glMultiTexCoord2f_(GL_TEXTURE1_ARB, x2+w2, y2); glVertex2f(1, -1); + glMultiTexCoord2f_(GL_TEXTURE0_ARB, x, y); glMultiTexCoord2f_(GL_TEXTURE1_ARB, x2, y2); glVertex2f(-1, -1); + glMultiTexCoord2f_(GL_TEXTURE0_ARB, x+w, y+h); glMultiTexCoord2f_(GL_TEXTURE1_ARB, x2+w2, y2+h2); glVertex2f(1, 1); + glMultiTexCoord2f_(GL_TEXTURE0_ARB, x, y+h); glMultiTexCoord2f_(GL_TEXTURE1_ARB, x2, y2+h2); glVertex2f(-1, 1); + glEnd(); +} + VARR(fog, 16, 4000, 1000024); bvec fogcolor(0x80, 0x99, 0xB3); HVARFR(fogcolour, 0, 0x8099B3, 0xFFFFFF, diff --git a/src/engine/renderlights.cpp b/src/engine/renderlights.cpp index 9021379..3e26422 100644 --- a/src/engine/renderlights.cpp +++ b/src/engine/renderlights.cpp @@ -243,10 +243,10 @@ void viewao() glBindTexture(GL_TEXTURE_RECTANGLE_ARB, aotex[2] ? aotex[2] : aotex[0]); int tw = aotex[2] ? gw : aow, th = aotex[2] ? gh : aoh; glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, th); glVertex2i(0, 0); - glTexCoord2f(tw, th); glVertex2i(w, 0); - glTexCoord2f(0, 0); glVertex2i(0, h); - glTexCoord2f(tw, 0); glVertex2i(w, h); + glTexCoord2f(0, th); glVertex2f(0, 0); + glTexCoord2f(tw, th); glVertex2f(w, 0); + glTexCoord2f(0, 0); glVertex2f(0, h); + glTexCoord2f(tw, 0); glVertex2f(w, h); glEnd(); notextureshader->set(); } @@ -1261,10 +1261,10 @@ void viewdepth() glColor3f(1, 1, 1); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, gdepthtex); glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, gh); glVertex2i(0, 0); - glTexCoord2f(gw, gh); glVertex2i(w, 0); - glTexCoord2f(0, 0); glVertex2i(0, h); - glTexCoord2f(gw, 0); glVertex2i(w, h); + glTexCoord2f(0, gh); glVertex2f(0, 0); + glTexCoord2f(gw, gh); glVertex2f(w, 0); + glTexCoord2f(0, 0); glVertex2f(0, h); + glTexCoord2f(gw, 0); glVertex2f(w, h); glEnd(); notextureshader->set(); } @@ -1278,10 +1278,10 @@ void viewrefract() glColor3f(1, 1, 1); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, refracttex); glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, gh); glVertex2i(0, 0); - glTexCoord2f(gw, gh); glVertex2i(w, 0); - glTexCoord2f(0, 0); glVertex2i(0, h); - glTexCoord2f(gw, 0); glVertex2i(w, h); + glTexCoord2f(0, gh); glVertex2f(0, 0); + glTexCoord2f(gw, gh); glVertex2f(w, 0); + glTexCoord2f(0, 0); glVertex2f(0, h); + glTexCoord2f(gw, 0); glVertex2f(w, h); glEnd(); notextureshader->set(); } @@ -1418,10 +1418,10 @@ void viewrsm() glColor3f(1, 1, 1); glBindTexture(GL_TEXTURE_RECTANGLE_ARB, debugrsm == 2 ? rsmnormaltex : rsmcolortex); glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, 0); glVertex2i(screen->w-w, screen->h-h); - glTexCoord2f(rsmsize, 0); glVertex2i(screen->w, screen->h-h); - glTexCoord2f(0, rsmsize); glVertex2i(screen->w-w, screen->h); - glTexCoord2f(rsmsize, rsmsize); glVertex2i(screen->w, screen->h); + glTexCoord2f(0, 0); glVertex2f(screen->w-w, screen->h-h); + glTexCoord2f(rsmsize, 0); glVertex2f(screen->w, screen->h-h); + glTexCoord2f(0, rsmsize); glVertex2f(screen->w-w, screen->h); + glTexCoord2f(rsmsize, rsmsize); glVertex2f(screen->w, screen->h); glEnd(); notextureshader->set(); } @@ -1435,10 +1435,10 @@ void viewrh() glBindTexture(GL_TEXTURE_3D, rhtex[1]); float z = (debugrh-1+0.5f)/float((rhgrid+2*rhborder)*rhsplits); glBegin(GL_TRIANGLE_STRIP); - glTexCoord3f(0, 0, z); glVertex2i(screen->w-w, screen->h-h); - glTexCoord3f(1, 0, z); glVertex2i(screen->w, screen->h-h); - glTexCoord3f(0, 1, z); glVertex2i(screen->w-w, screen->h); - glTexCoord3f(1, 1, z); glVertex2i(screen->w, screen->h); + glTexCoord3f(0, 0, z); glVertex2f(screen->w-w, screen->h-h); + glTexCoord3f(1, 0, z); glVertex2f(screen->w, screen->h-h); + glTexCoord3f(0, 1, z); glVertex2f(screen->w-w, screen->h); + glTexCoord3f(1, 1, z); glVertex2f(screen->w, screen->h); glEnd(); notextureshader->set(); } @@ -1566,10 +1566,10 @@ void viewshadowatlas() glBindTexture(shadowatlastarget, shadowatlastex); if(usesmcomparemode()) setsmnoncomparemode(); glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, 0); glVertex2i(screen->w-w, screen->h-h); - glTexCoord2f(tw, 0); glVertex2i(screen->w, screen->h-h); - glTexCoord2f(0, th); glVertex2i(screen->w-w, screen->h); - glTexCoord2f(tw, th); glVertex2i(screen->w, screen->h); + glTexCoord2f(0, 0); glVertex2f(screen->w-w, screen->h-h); + glTexCoord2f(tw, 0); glVertex2f(screen->w, screen->h-h); + glTexCoord2f(0, th); glVertex2f(screen->w-w, screen->h); + glTexCoord2f(tw, th); glVertex2f(screen->w, screen->h); glEnd(); if(usesmcomparemode()) setsmcomparemode(); notextureshader->set(); diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index 9dcb600..2d2345a 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -1210,12 +1210,7 @@ void renderpostfx(GLuint outfbo) ++tmu; } if(tmu) glActiveTexture_(GL_TEXTURE0_ARB); - glBegin(GL_TRIANGLE_STRIP); - glTexCoord2f(0, 0); glVertex2f(-1, -1); - glTexCoord2f(tw, 0); glVertex2f( 1, -1); - glTexCoord2f(0, th); glVertex2f(-1, 1); - glTexCoord2f(tw, th); glVertex2f( 1, 1); - glEnd(); + screenquad(tw, th); loopj(NUMPOSTFXBINDS) if(p.freeinputs&(1<= 0) {