Parameters = { #ifdef ENABLE_MSAA Texture2DMS gSource; int gNumSamples; #else Texture2D gSource; #endif }; Technique = { Language = "HLSL11"; Pass = { DepthRead = false; DepthWrite = false; Common = { struct VStoFS { float4 position : SV_POSITION; float2 uv0 : TEXCOORD0; }; }; Vertex = { struct VertexInput { float2 screenPos : POSITION; float2 uv0 : TEXCOORD0; }; VStoFS main(VertexInput input) { VStoFS output; output.position = float4(input.screenPos, 0, 1); output.uv0 = input.uv0; return output; } }; Fragment = { #ifdef ENABLE_MSAA int gNumSamples; Texture2DMS gSource : register(t0); float4 main(VStoFS input) : SV_Target0 { int2 iUV = trunc(input.uv0); float4 sum = float4(0, 0, 0, 0); for(int i = 0; i < gNumSamples; i++) sum += gSource.Load(iUV, i); return sum / gNumSamples; } #else Texture2D gSource : register(t0); float4 main(VStoFS input) : SV_Target0 { int2 iUV = trunc(input.uv0); return gSource.Load(int3(iUV.xy, 0)); } #endif }; }; }; Technique = { Language = "GLSL"; Pass = { DepthRead = false; DepthWrite = false; Vertex = { in vec2 bs_position; in vec2 bs_texcoord0; out vec2 texcoord0; out gl_PerVertex { vec4 gl_Position; }; void main() { gl_Position = vec4(bs_position, 0, 1); texcoord0 = bs_texcoord0; } }; Fragment = { in vec2 texcoord0; out vec4 fragColor; #ifdef ENABLE_MSAA uniform int gNumSamples; uniform sampler2DMS gSource; void main() { vec2 uv = trunc(texcoord0); ivec2 iUV = ivec2(uv.x, uv.y); vec4 sum = vec4(0, 0, 0, 0); for(int i = 0; i < gNumSamples; i++) sum += texelFetch(gSource, iUV, i); fragColor = sum / gNumSamples; } #else uniform sampler2D gSource; void main() { vec2 uv = trunc(texcoord0); ivec2 iUV = ivec2(uv.x, uv.y); fragColor = texelFetch(gSource, iUV, 0); } #endif }; }; };