Revision Difference
CustomPostProcessing#546067
<cat>Code.Shader</cat>⤶
<title>Custom Post-Processing</title>⤶
⤶
# Setting up your material and rendering it⤶
⤶
From the C# side you'll need to load a material with your custom shader and render it in the PostProcess event.⤶
⤶
```⤶
public CustomGame()⤶
{⤶
if(IsClient)⤶
{⤶
InitPostProcess();⤶
}⤶
}⤶
⤶
private Material _postProcessMaterial;⤶
⤶
public void InitPostProcess()⤶
{⤶
_postProcessMaterial = Material.Load("materials/post_process_example.vmat");⤶
}⤶
⤶
[Event("render.postprocess")]⤶
public void PostProcess()⤶
{⤶
if(_postProcessMaterial != null)⤶
{⤶
Render.CopyFrameBuffer(false);⤶
Render.Material = _postProcessMaterial;⤶
Render.DrawScreenQuad();⤶
}⤶
}⤶
```⤶
⤶
This is a basic example using the post processing material `post_process_example.vmat`. We're loading the material on the client in the game's constructor.⤶
That's all we need to do from the C# side to get our post processing material to draw, now we just need to actually make the shader.⤶
⤶
# Basic Post Processing Shader⤶
⤶
```⤶
HEADER⤶
{⤶
CompileTargets = ( IS_SM_50 && ( PC || VULKAN ) );⤶
Description = "Post Processing Shader";⤶
}⤶
⤶
//=========================================================================================================================⤶
⤶
FEATURES⤶
{⤶
#include "common/features.hlsl"⤶
}⤶
⤶
//=========================================================================================================================⤶
⤶
MODES⤶
{⤶
VrForward();⤶
Default();⤶
}⤶
⤶
//=========================================================================================================================⤶
⤶
COMMON⤶
{⤶
#include "system.fxc"⤶
#include "common.fxc"⤶
}⤶
⤶
//=========================================================================================================================⤶
⤶
struct VertexInput⤶
{⤶
float3 vPositionOs : POSITION < Semantic( PosXyz ); >;⤶
float2 vTexCoord : TEXCOORD0 < Semantic( LowPrecisionUv ); >; ⤶
};⤶
⤶
//=========================================================================================================================⤶
⤶
struct PixelInput⤶
{⤶
float4 vPositionPs : SV_Position;⤶
float2 vTexCoord : TEXCOORD0;⤶
};⤶
⤶
//=========================================================================================================================⤶
⤶
VS⤶
{⤶
PixelInput MainVs( VertexInput i )⤶
{⤶
PixelInput o;⤶
o.vPositionPs = float4(i.vPositionOs.xyz, 1.0f);⤶
o.vTexCoord = i.vTexCoord;⤶
return o;⤶
}⤶
}⤶
⤶
//=========================================================================================================================⤶
⤶
PS⤶
{⤶
struct PixelOutput⤶
{⤶
float4 vColor : SV_Target0;⤶
};⤶
⤶
// grab the frame buffer texture⤶
CreateTexture2D( g_FrameBuffer )< Attribute("FrameBufferCopyTexture"); SrgbRead( false ); >;⤶
⤶
PixelOutput MainPs( PixelInput i )⤶
{⤶
PixelOutput o;⤶
float2 uv = i.vTexCoord.xy; // uv from 0,0 in the top left to 1,1 in the bottom right⤶
⤶
float4 color = Tex2D(g_FrameBuffer, uv.xy).rgba; // grab color from frame texture⤶
color = 1 - color; // invert color⤶
⤶
o.vColor = color;⤶
return o;⤶
}⤶
}⤶
```⤶
⤶
This is a basic example post processing shader that inverts the screen color.