*/}}
Browse Source

Crappy fxaa not really working

Yiming Wu 2 years ago
parent
commit
c6e6548432
2 changed files with 52 additions and 5 deletions
  1. 50 3
      source/lagui/la_tns_kernel.c
  2. 2 2
      source/lagui/resources/la_widgets_viewers.c

+ 50 - 3
source/lagui/la_tns_kernel.c

@@ -162,6 +162,51 @@ void main(){\n\
     gl_Position=vVertex;\n\
     fViewDir = vUV;\n\
 }";
+
+#define LA_SHADER_LIB_FXAA \
+"#define DIFF_LUM_ABS_HOLD 0.0833 \n\
+#define DIFF_LUM_RES_HOLD 0.166\n\
+float luminance(vec3 col) {\n\
+    return dot(col, vec3(0.2126729f,  0.7151522f, 0.0721750f));\n\
+}\n\
+vec4 fxaa(in sampler2D tex, vec2 uv, vec2 texsize) {\n\
+    vec3 e = vec3(-1., 1., 0.);\n\
+    vec2 offuv = uv;\n\
+	vec3 colnw = texture(tex, uv + e.xy / texsize).rgb;\n\
+    vec3 coln  = texture(tex, uv + e.zy / texsize).rgb;\n\
+    vec3 colne = texture(tex, uv + e.yy / texsize).rgb;\n\
+    vec3 colw  = texture(tex, uv + e.xz / texsize).rgb;\n\
+    vec4 colm4  = texture(tex, uv + e.zz / texsize);\n\
+    vec3 colm  = colm4.rgb;\n\
+    vec3 cole  = texture(tex, uv + e.yz / texsize).rgb;\n\
+    vec3 colsw = texture(tex, uv + e.xx / texsize).rgb;\n\
+    vec3 cols  = texture(tex, uv + e.zx / texsize).rgb;\n\
+    vec3 colse = texture(tex, uv + e.yx / texsize).rgb;\n\
+    float lnw = luminance(colnw), ln = luminance(coln), lne = luminance(colne),\n\
+          lw  = luminance(colw),  lm = luminance(colm), le  = luminance(cole),\n\
+          lsw = luminance(colsw), ls = luminance(cols), lse = luminance(colse);\n\
+    float maxl = max(ln, max(ls, max(lw, max(le, lm))));\n\
+    float minl = min(ln, min(ls, min(lw, min(le, lm))));\n\
+    float diff = maxl - minl;\n\
+    if (diff < max(DIFF_LUM_ABS_HOLD, DIFF_LUM_RES_HOLD * maxl)) return colm4;\n\
+    float filterfactor = 0.;\n\
+    filterfactor += 2. * (ln + lw + ls + le) + lnw + lne + lsw + lse;\n\
+    filterfactor /= 12.;\n\
+    filterfactor = abs(filterfactor - lm);\n\
+    filterfactor = clamp(filterfactor / diff, 0., 1.);\n\
+    float blend = smoothstep(0., 1., filterfactor);\n\
+    blend *= blend;\n\
+    float hedge = 2.*(ln + ls - 2.*lm) + (lne + lse - 2.*le) + (lnw + lsw - 2.*lw);\n\
+    float vedge = 2.*(le + lw - 2.*lm) + (lne + lnw - 2.*ln) + (lse + lsw - 2.*ls);\n\
+    float ish = step(vedge, hedge);\n\
+    float psoff = ish >= 1.0 ? 1./texsize.y : 1./texsize.x;\n\
+    float pleft = ish >= 1.0 ? ln : le;\n\
+    float pright = ish >= 1.0 ? ls : lw;\n\
+    if (abs(pleft - lm) < abs(pright - lm)) psoff = -psoff;\n\
+    if (ish >= 1.0) { offuv.y += psoff * blend; }else{ offuv.x += psoff * blend; }\n\
+    return vec4(texture(tex, offuv).rgb,colm4.a);  \n\
+}\n"
+
 const char LA_RAY_FRAGMENT_SHADER[] = "#version 330\n\
 uniform vec3 uViewDir;\n\
 uniform vec3 uViewPos;\n\
@@ -169,14 +214,16 @@ uniform float uFOV;\n\
 in vec3 fViewDir;\n\
 uniform sampler2D TexColor;\n\
 uniform sampler2D TexNormal;\n\
-uniform sampler2D TexGPos;\n\
-void main(){\n\
+uniform sampler2D TexGPos;\n"
+LA_SHADER_LIB_FXAA
+"void main(){\n\
     float d=dot(uViewDir,normalize(fViewDir));\n\
     float target=cos(uFOV/2.);\n\
     vec4 color=vec4(1.,1.,1.,1.); float mul=0.;\n\
     if(d<(target+0.005)&&d>target) mul=1.0;\n\
     vec2 uv=gl_FragCoord.xy/textureSize(TexColor,0);\n\
-    vec4 buffer_color=texture2D(TexColor,uv);\n\
+    vec4 buffer_color=fxaa(TexColor,uv,textureSize(TexColor,0));\n\
+    //vec4 buffer_color=texture2D(TexColor,uv);\n\
     gl_FragColor = mul*color+buffer_color;\n\
 }";
 const char LA_SCENE_VERTEX_SHADER[] = "#version 330\n\

+ 2 - 2
source/lagui/resources/la_widgets_viewers.c

@@ -122,8 +122,7 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
 
     tnsDrawToOffscreen(e->DeferredOffScr,3,TNS_ATTACHMENT_ARRAY_0_1_2);
     tnsViewportWithScissor(0, 0, W, H);
-    tnsClearColorv(laThemeColor(bt,LA_BT_NORMAL));
-    tnsClearAll();
+    tnsClearColorv(laThemeColor(bt,LA_BT_NORMAL)); tnsClearAll();
 
     tnsApplyCameraView(W, H, c);
     tnsPushMatrix();
@@ -159,6 +158,7 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
     glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND);
 
     tnsDrawToOffscreen(e->OffScr, 1,0);
+    tnsClearColorv(laThemeColor(bt,LA_BT_NORMAL)); tnsClearAll();
     la_RootObjectDrawFullscreenQuad(e->DeferredOffScr, c, (real)W/(real)H);
 }
 void la_RootObjectDrawOverlay(laUiItem *ui, int h){