Okay I see. Thanks for the pointers
I have been sniffing around the various shaders that come with C2 and an FXAA shader I found on the net, and I'm starting to get an idea of what's what. I tried converting an FXAA shader I found on the net but get greeted with this error straight off the bat:
Error reading XML file
Unknown effect parameter type
Line 36, column 9
Element c2effect \ parameters \ param
... which is very strange since the XML is basically a straight copy/paste job from an existing effect. Man this isn't very confidence-building :/
XML:
<?xml version="1.0" encoding="UTF-8" ?>
<c2effect>
<!-- About -->
<id>fxaa</id> <!-- Never change the ID. Change the name instead -->
<name>FXAA</name>
<category>Blend</category>
<description>Apply FX antialiasing.</description>
<author>ErekT</author>
<!-- Settings -->
<!-- Extend the bounding box for effect processing by a number of pixels to show the edges
of effects which go beyond the object edges, e.g. blur and warp. -->
<extend-box-horizontal>0</extend-box-horizontal>
<extend-box-vertical>0</extend-box-vertical>
<!-- Set to true if the background is sampled (samplerBack is referenced at all in the shader) -->
<blends-background>true</blends-background>
<!-- Set to true if the background is not sampled at 1:1 with the foreground (e.g. the
background texture co-ordinates are modified in some way by the shader, as done
by Glass and Lens) -->
<cross-sampling>false</cross-sampling>
<!-- Set to true if the shader does not modify the opaque areas of the foreground. In other words
any opaque pixels in the original image are output in the same position and still fully opaque.
This is used to optimise the front-to-back renderer's depth pass, since it can still write depth
and skip overdraw for any objects using only shaders which preserve opaqueness. -->
<preserves-opaqueness>false</preserves-opaqueness>
<!-- Set to true if the effect changes over time, e.g. Noise or Warp effects. -->
<animated>false</animated>
<!-- Parameters -->
<parameters>
<param>
<name>Width</name>
<description>Game resolution X</description>
<type>int</type>
<initial>0</initial>
<uniform>WindowWidth</uniform>
</param>
<param>
<name>Height</name>
<description>Game resolution Y</description>
<type>int</type>
<initial>0</initial>
<uniform>WindowHeight</uniform>
</param>
</parameters>
</c2effect>
[/code:rmnp6ym2]
The shader itself:
[code:rmnp6ym2]
/////////////////////////////////////////////////////////
// FXAA effect
varying mediump vec2 vTex;
uniform lowp sampler2D samplerFront;
uniform lowp sampler2D samplerBack;
uniform mediump vec2 destStart;
uniform mediump vec2 destEnd;
//uniform lowp sampler2D tex;
//uniform mediump vec2 fragCoord;
uniform highp int WindowWidth;
uniform highp int WindowHeight;
void main(void)
{
lowp vec4 front = texture2D(samplerFront, vTex);
lowp vec4 back = texture2D(samplerBack, mix(destStart, destEnd, vTex));
vec2 v_rgbNW, vec2 v_rgbNE,
vec2 v_rgbSW, vec2 v_rgbSE,
vec2 v_rgbM) {
vec4 color;
mediump vec2 inverseVP = vec2(1.0 / WindowWidth, 1.0 / WindowHeight);
vec3 rgbNW = texture2D(samplerFront, v_rgbNW).xyz;
vec3 rgbNE = texture2D(samplerFront, v_rgbNE).xyz;
vec3 rgbSW = texture2D(samplerFront, v_rgbSW).xyz;
vec3 rgbSE = texture2D(samplerFront, v_rgbSE).xyz;
vec4 texColor = texture2D(samplerFront, v_rgbM);
vec3 rgbM = texColor.xyz;
vec3 luma = vec3(0.299, 0.587, 0.114);
float lumaNW = dot(rgbNW, luma);
float lumaNE = dot(rgbNE, luma);
float lumaSW = dot(rgbSW, luma);
float lumaSE = dot(rgbSE, luma);
float lumaM = dot(rgbM, luma);
float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));
float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));
mediump vec2 dir;
dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));
dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));
float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *
(0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);
float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),
max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),
dir * rcpDirMin)) * inverseVP;
vec3 rgbA = 0.5 * (
texture2D(samplerFront, vTex * inverseVP + dir * (1.0 / 3.0 - 0.5)).xyz +
texture2D(samplerFront, vTex * inverseVP + dir * (2.0 / 3.0 - 0.5)).xyz);
vec3 rgbB = rgbA * 0.5 + 0.25 * (
texture2D(samplerFront, vTex * inverseVP + dir * -0.5).xyz +
texture2D(samplerFront, vTex * inverseVP + dir * 0.5).xyz);
float lumaB = dot(rgbB, luma);
if ((lumaB < lumaMin) || (lumaB > lumaMax))
color = vec4(rgbA, texColor.a);
else
color = vec4(rgbB, texColor.a);
gl_FragColor = mix(gl_FragColor, color);
}
[/code:rmnp6ym2]
EDIT:
Seems 'int' isn't acceptable syntax so I replaced it with a float for now.