Skip to content

Instantly share code, notes, and snippets.

@Xorton
Last active August 30, 2017 17:14
Show Gist options
  • Save Xorton/b88c1a3a1701ceb992c5922a701bda69 to your computer and use it in GitHub Desktop.
Save Xorton/b88c1a3a1701ceb992c5922a701bda69 to your computer and use it in GitHub Desktop.
Transparent RenderTexture solution
class TransparentRenderTexture
{
#region Shaders
private static string mainVertexShader = @"
varying vec2 maskPos;
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
maskPos = gl_Position.xy / 2.0 + vec2(0.5, 0.5);
}
";
private static string mainFragmentShader = @"
uniform sampler2D texture;
uniform sampler2D mask;
varying vec2 maskPos;
void main()
{
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy) * gl_Color;
vec4 mask = texture2D(mask, maskPos);
gl_FragColor = pixel;
if(mask.r > 0.5)
{
gl_FragColor.rgb = pixel.rgb * pixel.a;
}
}
";
private static string maskVertexShader = @"
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_FrontColor = gl_Color;
}
";
private static string maskFragmentShader = @"
uniform sampler2D texture;
void main()
{
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy);
if(pixel.a < 0.001)
{
discard;
}
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
";
#endregion
private RenderTexture surface;
private RenderTexture mask;
private Shader mainShader;
private Shader maskShader;
private RenderStates mainRenderState;
private RenderStates maskRenderState;
public TransparentRenderTexture(uint width, uint height)
{
surface = new RenderTexture(width, height);
mask = new RenderTexture(width, height);
mainShader = Shader.FromString(mainVertexShader, mainFragmentShader);
mainShader.SetParameter("texture", Shader.CurrentTexture);
mainShader.SetParameter("mask", mask.Texture);
maskShader = Shader.FromString(maskVertexShader, maskFragmentShader);
maskShader.SetParameter("texture", Shader.CurrentTexture);
mainRenderState = new RenderStates(mainShader);
mainRenderState.BlendMode = new BlendMode(BlendMode.Factor.One, BlendMode.Factor.OneMinusSrcAlpha);
maskRenderState = new RenderStates(maskShader);
}
public void Draw(Drawable drawable)
{
surface.Draw(drawable, mainRenderState);
mask.Draw(drawable, maskRenderState);
mask.Display();
}
public void Clear()
{
surface.Clear(Color.Transparent);
mask.Clear(Color.Black);
}
public void Display()
{
surface.Display();
}
public Texture Texture { get { return surface.Texture; } }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment