====== Shader Compiler ====== ==== Bug: Samplers are incorrectly stripped when used with stripped Texture2D ==== Consider this code: #pragma shader_feature_local_fragment _ _ALBEDO; TEXTURE2D(_Albedo); TEXTURE2D(_Normal); SAMPLER(sampler_Albedo); half4 Frag(v2f i) { #if _ALBEDO return SAMPLE_TEXTURE2D(_Albedo, sampler_Albedo, i.uv); #endif return SAMPLE_TEXTURE2D(_Normal, sampler_Albedo, i.uv); // we share the albedo sampler } When compiling, two variants are created, one for when albedo is on, another for when it's off. This will throw an error saying that sampler_albedo cannot be found((Note: this error will only be thrown on some platforms (windows) )) ((the spelling of the error is wrong, as it's all lowercase when the variable is not)): ''"sampler_texname not found" compile error when sharing samplers'' DX9 associates samplers with textures, and so Unity does too. When you set a Unity Texture to ''Clamp'', it sets '-''clamp'' on sampler_. When the variant with ''_ALBEDO'' not defined is compiled, the compiler strips the albedo texture because it's not being used. **However**, Unity assumes that since ''sampler_Albedo'' is associated with the ''_Albedo'' texture, it should be stripped as well, even though the sampler is also being used by the ''_Normal''. Possible workarounds: * Give the _Normal texture its own sampler * Use a sampler not associated with a texture (which means the user cannot edit it via the texture settings) * Make sure you always sample the texture associated with the sampler so it doesn't get stripped. Something like: result *= saturate(1 + SAMPLE_TEXTURE2D_LOD(_Albedo, sampler_Albedo, float2(0,0), 11)); return result;