Last active
August 30, 2017 17:14
-
-
Save Xorton/b88c1a3a1701ceb992c5922a701bda69 to your computer and use it in GitHub Desktop.
Transparent RenderTexture solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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