- Home /
Question by
kalledk21 · Nov 10, 2017 at 08:33 AM ·
shaderscreenspaceuv coordinates
Creating a shader with "local" screenspace uv?
I'm trying to create a shader that creates a local screenspace uv. You can see my code at the bottom, my guess is that my method of trying to create a "bounding rect" is wrong. Below you can see the current result which is just a screenspace uv.
The effect I'm moving towards is a variation of the unmoving plaid, sort off, cause it'll clearly be moving but you know. However i'd like to make it look more like this;
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Custom/Gradient" {
Properties {
}
SubShader {
Tags{"Queue"="Transparent"}
Blend SrcAlpha OneMinusSrcAlpha
Lighting On
ZWrite On
Pass { //pass1
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct v2f
{
float4 pos : SV_POSITION;
float4 scpos : TEXCOORD0;
float4 screenRect : TEXCOORD1;
};
v2f vert (appdata_full v)
{
v2f o;
o.pos = UnityObjectToClipPos (v.vertex );
o.scpos = ComputeScreenPos(o.pos);
fixed2 corn1 = ComputeScreenPos(fixed4(0,0,0,1));
fixed2 corn2 = ComputeScreenPos(fixed4(1,0,0,1));
fixed2 corn3 = ComputeScreenPos(fixed4(0,1,0,1));
fixed2 corn4 = ComputeScreenPos(fixed4(1,1,0,1));
fixed2 corn5 = ComputeScreenPos(fixed4(0,0,1,1));
fixed2 corn6 = ComputeScreenPos(fixed4(1,0,1,1));
fixed2 corn7 = ComputeScreenPos(fixed4(0,1,1,1));
fixed2 corn8 = ComputeScreenPos(fixed4(1,1,1,1));
fixed minX = min(corn1.x,min(corn2.x, min(corn3.x, min(corn4.x, min(corn5.x, min(corn6.x,min(corn7.x,corn8.x)))))));
fixed minY = min(corn1.y,min(corn2.y, min(corn3.y, min(corn4.y, min(corn5.y, min(corn6.y,min(corn7.y,corn8.y)))))));
fixed maxX = max(corn1.x,max(corn2.x, max(corn3.x, max(corn4.x, max(corn5.x, max(corn6.x,max(corn7.x,corn8.x)))))));
fixed maxY = max(corn1.y,max(corn2.y, max(corn3.y, max(corn4.y, max(corn5.y, max(corn6.y,max(corn7.y,corn8.y)))))));
o.screenRect = fixed4(minX, minY, maxX, maxY);
return o;
}
fixed Vnormalize( fixed x, fixed amin, fixed amax)
{
return (x-amin)/(amax-amin);
}
fixed4 frag (v2f i) : COLOR
{
float2 uv2 = (i.scpos.xy/i.scpos.w);
float2 uv = float2(Vnormalize(uv2.x, i.screenRect.x, i.screenRect.z), Vnormalize(uv2.y, i.screenRect.y, i.screenRect.w));
fixed4 col = fixed4(uv.xy, 1,1);
return col;
}
ENDCG
}//pass 1
} //subshader
}//shader
Comment