<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://horde3d.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rand</id>
		<title>Horde3D Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://horde3d.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rand"/>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Special:Contributions/Rand"/>
		<updated>2026-11-13T12:38:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.3</generator>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=713</id>
		<title>Shading Technique - FXAA</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=713"/>
				<updated>2012-01-01T22:31:27Z</updated>
		
		<summary type="html">&lt;p&gt;Rand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These code snippets demonstrate how to set up an anti-aliasing filter that smoothes the image displayed on the screen. There are many ressources available for the exact math (e.g. [http://www.ngohq.com/images/articles/fxaa/FXAA_WhitePaper.pdf Nvidia]) behind FXAA and new variants are developed regularly.&lt;br /&gt;
&lt;br /&gt;
It has been created by [http://www.horde3d.org/forums/viewtopic.php?f=4&amp;amp;t=1599 worstplayer].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Shader ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[[FX]]&lt;br /&gt;
&lt;br /&gt;
// Samplers&lt;br /&gt;
sampler2D buf0 = sampler_state {&lt;br /&gt;
	Address = Clamp;&lt;br /&gt;
	Filter = None;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
context FXAA {&lt;br /&gt;
	VertexShader = compile GLSL VS_FSQUAD;&lt;br /&gt;
	PixelShader = compile GLSL FS_FXAA;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[VS_FSQUAD]]&lt;br /&gt;
&lt;br /&gt;
uniform mat4 projMat;&lt;br /&gt;
attribute vec3 vertPos;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
				&lt;br /&gt;
void main(void) {&lt;br /&gt;
	texCoords = vertPos.xy; &lt;br /&gt;
	gl_Position = projMat * vec4( vertPos, 1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[FS_FXAA]]&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D buf0;&lt;br /&gt;
uniform vec2 frameBufSize;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
&lt;br /&gt;
void main( void ) {&lt;br /&gt;
	//gl_FragColor.xyz = texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	//return;&lt;br /&gt;
&lt;br /&gt;
	float FXAA_SPAN_MAX = 8.0;&lt;br /&gt;
	float FXAA_REDUCE_MUL = 1.0/8.0;&lt;br /&gt;
	float FXAA_REDUCE_MIN = 1.0/128.0;&lt;br /&gt;
&lt;br /&gt;
	vec3 rgbNW=texture2D(buf0,texCoords+(vec2(-1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbNE=texture2D(buf0,texCoords+(vec2(1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSW=texture2D(buf0,texCoords+(vec2(-1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSE=texture2D(buf0,texCoords+(vec2(1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbM=texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	&lt;br /&gt;
	vec3 luma=vec3(0.299, 0.587, 0.114);&lt;br /&gt;
	float lumaNW = dot(rgbNW, luma);&lt;br /&gt;
	float lumaNE = dot(rgbNE, luma);&lt;br /&gt;
	float lumaSW = dot(rgbSW, luma);&lt;br /&gt;
	float lumaSE = dot(rgbSE, luma);&lt;br /&gt;
	float lumaM  = dot(rgbM,  luma);&lt;br /&gt;
	&lt;br /&gt;
	float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));&lt;br /&gt;
	float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));&lt;br /&gt;
	&lt;br /&gt;
	vec2 dir;&lt;br /&gt;
	dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));&lt;br /&gt;
	dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));&lt;br /&gt;
	&lt;br /&gt;
	float dirReduce = max(&lt;br /&gt;
		(lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL),&lt;br /&gt;
		FXAA_REDUCE_MIN);&lt;br /&gt;
	  &lt;br /&gt;
	float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);&lt;br /&gt;
	&lt;br /&gt;
	dir = min(vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),&lt;br /&gt;
		  max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),&lt;br /&gt;
		  dir * rcpDirMin)) / frameBufSize;&lt;br /&gt;
		&lt;br /&gt;
	vec3 rgbA = (1.0/2.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (1.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (2.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (0.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (3.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	float lumaB = dot(rgbB, luma);&lt;br /&gt;
&lt;br /&gt;
	if((lumaB &amp;lt; lumaMin) || (lumaB &amp;gt; lumaMax)){&lt;br /&gt;
		gl_FragColor.xyz=rgbA;&lt;br /&gt;
	}else{&lt;br /&gt;
		gl_FragColor.xyz=rgbB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Material ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Material&amp;gt;&lt;br /&gt;
	&amp;lt;Shader source=&amp;quot;fxaa.shader&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Material&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The pipeline ==&lt;br /&gt;
Basically, the normal geometry is rendered to a new buffer instead of straight to the screen. Afterwards, the new FXAA shader works over this buffer and renders to screen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;Pipeline&amp;gt;&lt;br /&gt;
	&amp;lt;Setup&amp;gt;&lt;br /&gt;
		&amp;lt;RenderTarget id=&amp;quot;FINALIMAGE&amp;quot; depthBuf=&amp;quot;true&amp;quot; numColBufs=&amp;quot;1&amp;quot; format=&amp;quot;RGBA16F&amp;quot; scale=&amp;quot;1.0&amp;quot; maxSamples=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/Setup&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
	&amp;lt;CommandQueue&amp;gt;&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Ambient&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;FINALIMAGE&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;ClearTarget depthBuf=&amp;quot;true&amp;quot; colBuf0=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;AMBIENT&amp;quot; class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Lighting&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DoForwardLightLoop class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Translucent&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;TRANSLUCENT&amp;quot; class=&amp;quot;Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &amp;lt;Stage id=&amp;quot;FXAA&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;BindBuffer sampler=&amp;quot;buf0&amp;quot; sourceRT=&amp;quot;FINALIMAGE&amp;quot; bufIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;DrawQuad material=&amp;quot;fxaa.material.xml&amp;quot; context=&amp;quot;FXAA&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;UnbindBuffers /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Overlays&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawOverlays context=&amp;quot;OVERLAY&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
	&amp;lt;/CommandQueue&amp;gt;&lt;br /&gt;
&amp;lt;/Pipeline&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rand</name></author>	</entry>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=712</id>
		<title>Shading Technique - FXAA</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=712"/>
				<updated>2012-01-01T22:28:25Z</updated>
		
		<summary type="html">&lt;p&gt;Rand: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These code snippets demonstrate how to set up an anti-aliasing filter that smoothes the image displayed on the screen. There are many ressources available for the exact math (e.g. [http://www.ngohq.com/images/articles/fxaa/FXAA_WhitePaper.pdf Nvidia]) behind FXAA and new variants are developed regularly.&lt;br /&gt;
&lt;br /&gt;
It has been created by [http://www.horde3d.org/forums/viewtopic.php?f=4&amp;amp;t=1599 worstplayer].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Shader ==&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= fxaa.shader|&lt;br /&gt;
code=&lt;br /&gt;
[[FX]]&lt;br /&gt;
&lt;br /&gt;
// Samplers&lt;br /&gt;
sampler2D buf0 = sampler_state {&lt;br /&gt;
	Address = Clamp;&lt;br /&gt;
	Filter = None;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
context FXAA {&lt;br /&gt;
	VertexShader = compile GLSL VS_FSQUAD;&lt;br /&gt;
	PixelShader = compile GLSL FS_FXAA;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[VS_FSQUAD]]&lt;br /&gt;
&lt;br /&gt;
uniform mat4 projMat;&lt;br /&gt;
attribute vec3 vertPos;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
				&lt;br /&gt;
void main(void) {&lt;br /&gt;
	texCoords = vertPos.xy; &lt;br /&gt;
	gl_Position = projMat * vec4( vertPos, 1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[FS_FXAA]]&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D buf0;&lt;br /&gt;
uniform vec2 frameBufSize;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
&lt;br /&gt;
void main( void ) {&lt;br /&gt;
	//gl_FragColor.xyz = texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	//return;&lt;br /&gt;
&lt;br /&gt;
	float FXAA_SPAN_MAX = 8.0;&lt;br /&gt;
	float FXAA_REDUCE_MUL = 1.0/8.0;&lt;br /&gt;
	float FXAA_REDUCE_MIN = 1.0/128.0;&lt;br /&gt;
&lt;br /&gt;
	vec3 rgbNW=texture2D(buf0,texCoords+(vec2(-1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbNE=texture2D(buf0,texCoords+(vec2(1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSW=texture2D(buf0,texCoords+(vec2(-1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSE=texture2D(buf0,texCoords+(vec2(1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbM=texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	&lt;br /&gt;
	vec3 luma=vec3(0.299, 0.587, 0.114);&lt;br /&gt;
	float lumaNW = dot(rgbNW, luma);&lt;br /&gt;
	float lumaNE = dot(rgbNE, luma);&lt;br /&gt;
	float lumaSW = dot(rgbSW, luma);&lt;br /&gt;
	float lumaSE = dot(rgbSE, luma);&lt;br /&gt;
	float lumaM  = dot(rgbM,  luma);&lt;br /&gt;
	&lt;br /&gt;
	float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));&lt;br /&gt;
	float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));&lt;br /&gt;
	&lt;br /&gt;
	vec2 dir;&lt;br /&gt;
	dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));&lt;br /&gt;
	dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));&lt;br /&gt;
	&lt;br /&gt;
	float dirReduce = max(&lt;br /&gt;
		(lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL),&lt;br /&gt;
		FXAA_REDUCE_MIN);&lt;br /&gt;
	  &lt;br /&gt;
	float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);&lt;br /&gt;
	&lt;br /&gt;
	dir = min(vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),&lt;br /&gt;
		  max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),&lt;br /&gt;
		  dir * rcpDirMin)) / frameBufSize;&lt;br /&gt;
		&lt;br /&gt;
	vec3 rgbA = (1.0/2.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (1.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (2.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (0.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (3.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	float lumaB = dot(rgbB, luma);&lt;br /&gt;
&lt;br /&gt;
	if((lumaB &amp;lt; lumaMin) || (lumaB &amp;gt; lumaMax)){&lt;br /&gt;
		gl_FragColor.xyz=rgbA;&lt;br /&gt;
	}else{&lt;br /&gt;
		gl_FragColor.xyz=rgbB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Material ==&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= fxaa.material.xml|&lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;Material&amp;gt;&lt;br /&gt;
	&amp;lt;Shader source=&amp;quot;fxaa.shader&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Material&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The pipeline ==&lt;br /&gt;
Basically, the normal geometry is rendered to a new buffer instead of straight to the screen. Afterwards, the new FXAA shader works over this buffer and renders to screen.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= forward_plus_fxaa.pipeline.xml|&lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;Pipeline&amp;gt;&lt;br /&gt;
	&amp;lt;Setup&amp;gt;&lt;br /&gt;
		&amp;lt;RenderTarget id=&amp;quot;FINALIMAGE&amp;quot; depthBuf=&amp;quot;true&amp;quot; numColBufs=&amp;quot;1&amp;quot; format=&amp;quot;RGBA16F&amp;quot; scale=&amp;quot;1.0&amp;quot; maxSamples=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/Setup&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
	&amp;lt;CommandQueue&amp;gt;&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Ambient&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;FINALIMAGE&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;ClearTarget depthBuf=&amp;quot;true&amp;quot; colBuf0=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;AMBIENT&amp;quot; class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Lighting&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DoForwardLightLoop class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Translucent&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;TRANSLUCENT&amp;quot; class=&amp;quot;Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &amp;lt;Stage id=&amp;quot;FXAA&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;BindBuffer sampler=&amp;quot;buf0&amp;quot; sourceRT=&amp;quot;FINALIMAGE&amp;quot; bufIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;DrawQuad material=&amp;quot;fxaa.material.xml&amp;quot; context=&amp;quot;FXAA&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;UnbindBuffers /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Overlays&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawOverlays context=&amp;quot;OVERLAY&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
	&amp;lt;/CommandQueue&amp;gt;&lt;br /&gt;
&amp;lt;/Pipeline&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rand</name></author>	</entry>

	<entry>
		<id>http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=711</id>
		<title>Shading Technique - FXAA</title>
		<link rel="alternate" type="text/html" href="http://horde3d.org/wiki/index.php?title=Shading_Technique_-_FXAA&amp;diff=711"/>
				<updated>2012-01-01T22:26:45Z</updated>
		
		<summary type="html">&lt;p&gt;Rand: New page: __NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}   These code snippets demonstrate how to set up an anti-aliasing filter that smoothes the image displayed on the screen...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__{{ContentBlock|color=white|content={{!!}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These code snippets demonstrate how to set up an anti-aliasing filter that smoothes the image displayed on the screen. There are many ressources available for the exact math (e.g. [http://www.ngohq.com/images/articles/fxaa/FXAA_WhitePaper.pdf Nvidia]) behind FXAA and new variants are developed regularly.&lt;br /&gt;
&lt;br /&gt;
It has been created by [http://www.horde3d.org/forums/viewtopic.php?f=4&amp;amp;t=1599 worstplayer].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Shader ==&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= fxaa.shader|&lt;br /&gt;
code=&lt;br /&gt;
[[FX]]&lt;br /&gt;
&lt;br /&gt;
// Samplers&lt;br /&gt;
sampler2D buf0 = sampler_state {&lt;br /&gt;
	Address = Clamp;&lt;br /&gt;
	Filter = None;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
context FXAA {&lt;br /&gt;
	VertexShader = compile GLSL VS_FSQUAD;&lt;br /&gt;
	PixelShader = compile GLSL FS_FXAA;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[VS_FSQUAD]]&lt;br /&gt;
&lt;br /&gt;
uniform mat4 projMat;&lt;br /&gt;
attribute vec3 vertPos;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
				&lt;br /&gt;
void main(void) {&lt;br /&gt;
	texCoords = vertPos.xy; &lt;br /&gt;
	gl_Position = projMat * vec4( vertPos, 1 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[FS_FXAA]]&lt;br /&gt;
&lt;br /&gt;
uniform sampler2D buf0;&lt;br /&gt;
uniform vec2 frameBufSize;&lt;br /&gt;
varying vec2 texCoords;&lt;br /&gt;
&lt;br /&gt;
void main( void ) {&lt;br /&gt;
	//gl_FragColor.xyz = texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	//return;&lt;br /&gt;
&lt;br /&gt;
	float FXAA_SPAN_MAX = 8.0;&lt;br /&gt;
	float FXAA_REDUCE_MUL = 1.0/8.0;&lt;br /&gt;
	float FXAA_REDUCE_MIN = 1.0/128.0;&lt;br /&gt;
&lt;br /&gt;
	vec3 rgbNW=texture2D(buf0,texCoords+(vec2(-1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbNE=texture2D(buf0,texCoords+(vec2(1.0,-1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSW=texture2D(buf0,texCoords+(vec2(-1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbSE=texture2D(buf0,texCoords+(vec2(1.0,1.0)/frameBufSize)).xyz;&lt;br /&gt;
	vec3 rgbM=texture2D(buf0,texCoords).xyz;&lt;br /&gt;
	&lt;br /&gt;
	vec3 luma=vec3(0.299, 0.587, 0.114);&lt;br /&gt;
	float lumaNW = dot(rgbNW, luma);&lt;br /&gt;
	float lumaNE = dot(rgbNE, luma);&lt;br /&gt;
	float lumaSW = dot(rgbSW, luma);&lt;br /&gt;
	float lumaSE = dot(rgbSE, luma);&lt;br /&gt;
	float lumaM  = dot(rgbM,  luma);&lt;br /&gt;
	&lt;br /&gt;
	float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));&lt;br /&gt;
	float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));&lt;br /&gt;
	&lt;br /&gt;
	vec2 dir;&lt;br /&gt;
	dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));&lt;br /&gt;
	dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));&lt;br /&gt;
	&lt;br /&gt;
	float dirReduce = max(&lt;br /&gt;
		(lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL),&lt;br /&gt;
		FXAA_REDUCE_MIN);&lt;br /&gt;
	  &lt;br /&gt;
	float rcpDirMin = 1.0/(min(abs(dir.x), abs(dir.y)) + dirReduce);&lt;br /&gt;
	&lt;br /&gt;
	dir = min(vec2( FXAA_SPAN_MAX,  FXAA_SPAN_MAX),&lt;br /&gt;
		  max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),&lt;br /&gt;
		  dir * rcpDirMin)) / frameBufSize;&lt;br /&gt;
		&lt;br /&gt;
	vec3 rgbA = (1.0/2.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (1.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (2.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	vec3 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (0.0/3.0 - 0.5)).xyz +&lt;br /&gt;
		texture2D(buf0, texCoords.xy + dir * (3.0/3.0 - 0.5)).xyz);&lt;br /&gt;
	float lumaB = dot(rgbB, luma);&lt;br /&gt;
&lt;br /&gt;
	if((lumaB &amp;lt; lumaMin) || (lumaB &amp;gt; lumaMax)){&lt;br /&gt;
		gl_FragColor.xyz=rgbA;&lt;br /&gt;
	}else{&lt;br /&gt;
		gl_FragColor.xyz=rgbB;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The Material ==&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= fxaa.material.xml|&lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;Material&amp;gt;&lt;br /&gt;
	&amp;lt;Shader source=&amp;quot;fxaa.shader&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/Material&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== The pipeline ==&lt;br /&gt;
Basically, the normal geometry is rendered to a new buffer instead of straight to the screen. Afterwards, the new FXAA shader works over this buffer and renders to screen.&lt;br /&gt;
&lt;br /&gt;
{{CppSourceCode|&lt;br /&gt;
description= forward_plus_fxaa.pipeline.xml|&lt;br /&gt;
code=&lt;br /&gt;
&amp;lt;Pipeline&amp;gt;&lt;br /&gt;
	&amp;lt;Setup&amp;gt;&lt;br /&gt;
		&amp;lt;RenderTarget id=&amp;quot;FINALIMAGE&amp;quot; depthBuf=&amp;quot;true&amp;quot; numColBufs=&amp;quot;1&amp;quot; format=&amp;quot;RGBA16F&amp;quot; scale=&amp;quot;1.0&amp;quot; maxSamples=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
	&amp;lt;/Setup&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
	&amp;lt;CommandQueue&amp;gt;&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Ambient&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;FINALIMAGE&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;ClearTarget depthBuf=&amp;quot;true&amp;quot; colBuf0=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;
			&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;AMBIENT&amp;quot; class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Lighting&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DoForwardLightLoop class=&amp;quot;~Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Translucent&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawGeometry context=&amp;quot;TRANSLUCENT&amp;quot; class=&amp;quot;Translucent&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
		&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &amp;lt;Stage id=&amp;quot;FXAA&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;SwitchTarget target=&amp;quot;&amp;quot; /&amp;gt;&lt;br /&gt;
			&amp;lt;BindBuffer sampler=&amp;quot;buf0&amp;quot; sourceRT=&amp;quot;FINALIMAGE&amp;quot; bufIndex=&amp;quot;0&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;DrawQuad material=&amp;quot;fxaa.material.xml&amp;quot; context=&amp;quot;FXAA&amp;quot; /&amp;gt;&lt;br /&gt;
            &amp;lt;UnbindBuffers /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
        &amp;lt;!-- --&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
		&amp;lt;Stage id=&amp;quot;Overlays&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;DrawOverlays context=&amp;quot;OVERLAY&amp;quot; /&amp;gt;&lt;br /&gt;
		&amp;lt;/Stage&amp;gt;&lt;br /&gt;
	&amp;lt;/CommandQueue&amp;gt;&lt;br /&gt;
&amp;lt;/Pipeline&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Rand</name></author>	</entry>

	</feed>