- Home /
TexGen'ed UVs - how to access in surface shader?
Hi,
If I have a shader with property say:
_MainTex ("Main Tex", 2D) = "gray" { TexGen ObjectLinear }
And I have a surface shader:
struct Input {
float2 uv_MainTex : TEXCOORD0;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
fixed3 col;
o.Albedo = tex2D(_MainTex,float4(IN.uv_MainTex).rgb;
o.Alpha = 0.0;
}
Will IN.uv_MainTex have the TexGen'ed UV coordinates? Because for me it seems that it is not the case or I'm doing something wrong. Any help would be very much appreciated!
Answer by moosefetcher · Jan 21, 2016 at 06:39 PM
I've just spent the best part of a day figuring this out - I couldn't find a version of this question with an answer, so I'll attempt to answer it here: (Sorry this is so late - I'm new to Unity) I don't know if you need the TEXCOOD0, so it could be that I'm way off beam here, but you can access the UV coordinates in the surf struct and add an offset to sample MainTex in an alternate location, like this:
void surf (Input IN, inout SurfaceOutput o) {
float2 offsetUVs = IN.uv_MainTex;
offsetUVs.y += _adjustmentAmount;
_surfaceColour = saturate(tex2D (_MainTex, offsetUVs).rgba * _offsetColour.rgba);
}
The tex2D method takes a sampler2D and a float2 as parameters, so you can make a change to the float2 from the input struct (IN.uv_MainTex) and pass the altered float2 into the tex2D method instead. I hope that works for you.
Your answer
Follow this Question
Related Questions
Second UV set as coordinates for a different texture? 3 Answers
uv not being passed through from vertex to surface shader 1 Answer
UV offset in surface shader. 1 Answer
How to get the global position of a vertex in a Cg vertex shader? 1 Answer
How to force the compilation of a shader in Unity? 5 Answers