- Home /
Get gameobject pivot in shader
I'm trying to get simple shader for 2D game which would act as a mask, allowing player to see character behind objects. I'm mainly using shader from this question and try to add one additional feature to it. So what I'm struggling with is applying mask only to objects in front of character and not behind it.
I'm using what is most commonly referred to as 3/4 perspective (find example here) and here's the way I find whether I should apply mask to an object or not (you may skip this section if you're familiar with this perspective):
Finding if object is in front or behind of another one is pretty easy: I just need to compare y coordinates of two, and whichever is smaller, that object is closer to camera. Also if some object is placed lower on scene than character but is greater by height, it's centre may be higher than character, so mask would not apply to this object. To avoid this bug I've placed pivots of all objects to bottom centre.
Now the only task I'm left with is getting object's pivot coordinates and compare it to character pivot which I pass to shader as variable. All unity answers, tutorials and forum threads I've found are suggesting that mul(unity_ObjectToWorld, float4(0, 0, 0, 1))
will get me the correct coordinates. But in my case this works only partially and after some coordinates becomes completely broken. Here's code I'm using. Note that for testing purposes I've replaced all the mask code with just setting red channel to 1, to easily see whether code inside if will be applied to object or not. I've also removed all basic shader code for snippet below.
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.origin = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
return OUT;
}
sampler2D _MainTex;
float _FadeBottom;
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = tex2D(_MainTex, IN.texcoord);
if (IN.origin.y < _FadeBottom)
{
c.r = 1;
}
return c;
}
And here is result of this shader, with character at bottom left of the screen
Until this point everything seems to work but as we get higher at the scene, we can see as it breaks
So my final question is: what is a proper way in a shader to get pivot of the object shader is applied to?
Your answer
Follow this Question
Related Questions
How can I get a texture to render in object space? 1 Answer
Dividng clip space by "w" warps the output? 1 Answer
Change Color Based On Pixel X Coordinate in Shader 1 Answer
Get the screen coordinates of an object altered by Fisheye 0 Answers
Can you supply texture co-ordinates for projector cookies? 0 Answers