- Home /
Non rectangular GUI Mask / Matte?
I have looked around a bit but can't find anything definitive on this.
I'm using GUI.DrawTexture along with a GUI Group to move textureA behind textureB so that textureA looks like it's disappearing. However, textureB has transparency and a curve so using a simple rect from the GUI Group does not achieve the look.
Is there a way to pass in alpha or color information from another texture in order to get a non-rect masking effect?
I saw something about using the Graphics class along with a custom material which I will look into more. I don't know shader scripting very well so I am hoping there is a more simple approach that I am overlooking.
Thanks! John
Edit: Adding an image to help clarify my question.
Not sure I get what you're trying to do. You say you want to move a texture behind another, but I can't visualize what you mean. Can you include a couple screen captures of the beginning and end frame of what you want to do? When you say the texture is 'disappearing' I think fading - is that the case?
I added an image to help visualize. I need a GUI texture to move behind another GUI texture that has transparency and a curve. I want it to look like the moving texture is extending in/out from the top of the curve. Thanks for replying, I hope the image helps, I feel like I'm missing something simple.
Answer by Julien-Lynge · Aug 14, 2011 at 05:26 AM
Tricky :). If the moving part (textureA) has no transparency, you could try using a transparent cutout material. There's an example of more or less what you'd need to do here, but your alpha channel would look more like this:
Then, you'd just check the screen y-value of your object and adjust the alpha cutoff accordingly. That's the easiest way I know of to do it without a bunch of coding and pixel manipulation - hopefully someone else will come along with a more elegant solution :)
Answer by TheGering · Jan 26, 2015 at 03:14 PM
Or you could cutout the Texture before using it:
public static Texture2D CircularCutoutTexture(Texture2D texture) {
if (texture == null) return null;
Color[] pixels = texture.GetPixels(0);
// generate cutout
Texture2D cutout = new Texture2D(texture.width, texture.height, TextureFormat.RGBA32, false);
int size = (int)Mathf.Sqrt(pixels.Length);
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
float dx = x - size/2;
float dy = y - size/2;
float d = Mathf.Sqrt(dx * dx + dy * dy) - size/2;
if (d >= 0) pixels[x + y * size].a = Mathf.Max(1 - d, 0);
}
}
cutout.SetPixels(pixels, 0);
cutout.Apply();
return cutout;
}
Your answer
Follow this Question
Related Questions
Strange shader behaviour on UI component 0 Answers
iphone album art how? 0 Answers
Water foam 1 Answer
How to create this type of mask? 0 Answers