瀏覽代碼

* Cleaned up FXAA shader, moved requirement to GLSL 1.3, removed dependency on EXT_gpu_shader4

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9094 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
sha..rd 13 年之前
父節點
當前提交
e9a28ced31

+ 41 - 35
engine/src/core-data/Common/MatDefs/Post/FXAA.frag

@@ -1,73 +1,79 @@
-#extension GL_EXT_gpu_shader4 : enable
+///#extension GL_EXT_gpu_shader4 : disable
+#extension all : disable
+
 uniform sampler2D m_Texture;
 uniform sampler2D m_Texture;
 uniform vec2 g_Resolution;
 uniform vec2 g_Resolution;
-varying vec2 texCoord;
+
 uniform float m_VxOffset;
 uniform float m_VxOffset;
 uniform float m_SpanMax;
 uniform float m_SpanMax;
 uniform float m_ReduceMul;
 uniform float m_ReduceMul;
+
+varying vec2 texCoord;
 varying vec4 posPos;
 varying vec4 posPos;
-#define FxaaInt2 ivec2
-#define FxaaFloat2 vec2
-#define FxaaTexLod0(t, p) texture2DLod(t, p, 0.0)
-#define FxaaTexOff(t, p, o, r) texture2DLodOffset(t, p, 0.0, o)
+
+#define FxaaTexLod0(t, p) textureLod(t, p, 0.0)
+#define FxaaTexOff(t, p, o, r) textureLodOffset(t, p, 0.0, o)
+
 vec3 FxaaPixelShader(
 vec3 FxaaPixelShader(
-  vec4 posPos, // Output of FxaaVertexShader interpolated across screen.
+  vec4 posPos,   // Output of FxaaVertexShader interpolated across screen.
   sampler2D tex, // Input texture.
   sampler2D tex, // Input texture.
   vec2 rcpFrame) // Constant {1.0/frameWidth, 1.0/frameHeight}.
   vec2 rcpFrame) // Constant {1.0/frameWidth, 1.0/frameHeight}.
 {
 {
-/*---------------------------------------------------------*/
+
     #define FXAA_REDUCE_MIN   (1.0/128.0)
     #define FXAA_REDUCE_MIN   (1.0/128.0)
     //#define FXAA_REDUCE_MUL   (1.0/8.0)
     //#define FXAA_REDUCE_MUL   (1.0/8.0)
     //#define FXAA_SPAN_MAX     8.0
     //#define FXAA_SPAN_MAX     8.0
-/*---------------------------------------------------------*/
+
     vec3 rgbNW = FxaaTexLod0(tex, posPos.zw).xyz;
     vec3 rgbNW = FxaaTexLod0(tex, posPos.zw).xyz;
-    vec3 rgbNE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,0), rcpFrame.xy).xyz;
-    vec3 rgbSW = FxaaTexOff(tex, posPos.zw, FxaaInt2(0,1), rcpFrame.xy).xyz;
-    vec3 rgbSE = FxaaTexOff(tex, posPos.zw, FxaaInt2(1,1), rcpFrame.xy).xyz;
+    vec3 rgbNE = FxaaTexOff(tex, posPos.zw, ivec2(1,0), rcpFrame.xy).xyz;
+    vec3 rgbSW = FxaaTexOff(tex, posPos.zw, ivec2(0,1), rcpFrame.xy).xyz;
+    vec3 rgbSE = FxaaTexOff(tex, posPos.zw, ivec2(1,1), rcpFrame.xy).xyz;
+
     vec3 rgbM  = FxaaTexLod0(tex, posPos.xy).xyz;
     vec3 rgbM  = FxaaTexLod0(tex, posPos.xy).xyz;
-/*---------------------------------------------------------*/
+
     vec3 luma = vec3(0.299, 0.587, 0.114);
     vec3 luma = vec3(0.299, 0.587, 0.114);
     float lumaNW = dot(rgbNW, luma);
     float lumaNW = dot(rgbNW, luma);
     float lumaNE = dot(rgbNE, luma);
     float lumaNE = dot(rgbNE, luma);
     float lumaSW = dot(rgbSW, luma);
     float lumaSW = dot(rgbSW, luma);
     float lumaSE = dot(rgbSE, luma);
     float lumaSE = dot(rgbSE, luma);
     float lumaM  = dot(rgbM,  luma);
     float lumaM  = dot(rgbM,  luma);
-/*---------------------------------------------------------*/
+
     float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
     float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
     float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
     float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
-/*---------------------------------------------------------*/
+
     vec2 dir;
     vec2 dir;
     dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
     dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
     dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));
     dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));
-/*---------------------------------------------------------*/
+
     float dirReduce = max(
     float dirReduce = max(
         (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * m_ReduceMul),
         (lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * m_ReduceMul),
         FXAA_REDUCE_MIN);
         FXAA_REDUCE_MIN);
     float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
     float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);
-    dir = min(FxaaFloat2( m_SpanMax,  m_SpanMax),
-          max(FxaaFloat2(-m_SpanMax, -m_SpanMax),
+    dir = min(vec2( m_SpanMax,  m_SpanMax),
+          max(vec2(-m_SpanMax, -m_SpanMax),
           dir * rcpDirMin)) * rcpFrame.xy;
           dir * rcpDirMin)) * rcpFrame.xy;
-/*--------------------------------------------------------*/
+
     vec3 rgbA = (1.0/2.0) * (
     vec3 rgbA = (1.0/2.0) * (
-        FxaaTexLod0(tex, posPos.xy + dir * (1.0/3.0 - 0.5)).xyz +
-        FxaaTexLod0(tex, posPos.xy + dir * (2.0/3.0 - 0.5)).xyz);
+        FxaaTexLod0(tex, posPos.xy + dir * vec2(1.0/3.0 - 0.5)).xyz +
+        FxaaTexLod0(tex, posPos.xy + dir * vec2(2.0/3.0 - 0.5)).xyz);
     vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (
     vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (
-        FxaaTexLod0(tex, posPos.xy + dir * (0.0/3.0 - 0.5)).xyz +
-        FxaaTexLod0(tex, posPos.xy + dir * (3.0/3.0 - 0.5)).xyz);
+        FxaaTexLod0(tex, posPos.xy + dir * vec2(0.0/3.0 - 0.5)).xyz +
+        FxaaTexLod0(tex, posPos.xy + dir * vec2(3.0/3.0 - 0.5)).xyz);
+
     float lumaB = dot(rgbB, luma);
     float lumaB = dot(rgbB, luma);
-    if((lumaB < lumaMin) || (lumaB > lumaMax)) return rgbA;
-    return rgbB; }
-vec4 PostFX(sampler2D tex, vec2 uv, float time)
-{
-    vec4 c = vec4(0.0);
-    vec2 rcpFrame = vec2(1.0/g_Resolution.x, 1.0/g_Resolution.y);
-    c.rgb = FxaaPixelShader(posPos, tex, rcpFrame);
-    //c.rgb = 1.0 - texture2D(tex, posPos.xy).rgb;
-    c.a = 1.0;
-    return c;
+
+    if ((lumaB < lumaMin) || (lumaB > lumaMax))
+    {
+        return rgbA;
+    }
+    else
+    {
+        return rgbB; 
+    }
 }
 }
+
 void main()
 void main()
 {
 {
-    vec2 uv = texCoord.st;
-    gl_FragColor = PostFX(m_Texture, uv, 0.0);
+    vec2 rcpFrame = vec2(1.0) / g_Resolution;
+    gl_FragColor = vec4(FxaaPixelShader(posPos, m_Texture, rcpFrame), 1.0);
 }
 }

+ 1 - 1
engine/src/core-data/Common/MatDefs/Post/FXAA.j3md

@@ -9,7 +9,7 @@ MaterialDef FXAA {
     }
     }
     Technique {
     Technique {
         VertexShader GLSL100:   Common/MatDefs/Post/FXAA.vert
         VertexShader GLSL100:   Common/MatDefs/Post/FXAA.vert
-        FragmentShader GLSL120: Common/MatDefs/Post/FXAA.frag
+        FragmentShader GLSL130: Common/MatDefs/Post/FXAA.frag
         WorldParameters {
         WorldParameters {
             WorldViewProjectionMatrix
             WorldViewProjectionMatrix
             Resolution
             Resolution

+ 7 - 4
engine/src/core-data/Common/MatDefs/Post/FXAA.vert

@@ -1,15 +1,18 @@
 uniform mat4 g_WorldViewProjectionMatrix;
 uniform mat4 g_WorldViewProjectionMatrix;
 uniform vec2 g_Resolution;
 uniform vec2 g_Resolution;
+
+uniform float m_SubPixelShift;
+
 attribute vec4 inPosition;
 attribute vec4 inPosition;
 attribute vec2 inTexCoord;
 attribute vec2 inTexCoord;
+
 varying vec2 texCoord;
 varying vec2 texCoord;
-uniform float m_SubPixelShift;
 varying vec4 posPos;
 varying vec4 posPos;
+
 void main() {
 void main() {
     gl_Position = inPosition * 2.0 - 1.0; //vec4(pos, 0.0, 1.0);
     gl_Position = inPosition * 2.0 - 1.0; //vec4(pos, 0.0, 1.0);
     texCoord = inTexCoord;
     texCoord = inTexCoord;
-    vec2 rcpFrame = vec2(1.0/g_Resolution.x, 1.0/g_Resolution.y);
+    vec2 rcpFrame = vec2(1.0) / g_Resolution;
     posPos.xy = inTexCoord.xy;
     posPos.xy = inTexCoord.xy;
-    posPos.zw = inTexCoord.xy -
-                  (rcpFrame * (0.5 + m_SubPixelShift));
+    posPos.zw = inTexCoord.xy - (rcpFrame * vec2(0.5 + m_SubPixelShift));
 }
 }