- Home /
Shader Property Array of Textures
Hello,
I'm working on a project that involves using colored labels to denote specific areas on a 3D model. After some searching and experimenting, I think I've found the best way to accomplish the desired effect is to write a custom shader. The built-in decal shader is pretty much exactly what I want; however, I would like to be able to use more than a single texture as a decal. Is it possible to define a texture array within a shader?
Based on my searching, the answer appears to be no:
http://forum.unity3d.com/threads/109667-Dynamic-Shader-Or-Array-of-Shaders-Question
I've working around this by simply defining the number of textures I want as individual 2Ds, but this seems dumb as I would like it to be able to grow the list of textures.
Here is an example:
Shader "MultiDecal" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB)", 2D) = "white" {}
_DecalTex ("Decal (RGBA)", 2D) = "black" {}
_DecalTex2 ("Decal 2 (RGBA)", 2D) = "black" {}
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 250
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
sampler2D _DecalTex;
sampler2D _DecalTex2;
fixed4 _Color;
struct Input {
float2 uv_MainTex;
float2 uv_DecalTex;
float2 uv_DecalTex2;
};
void surf (Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
half4 decal = tex2D(_DecalTex, IN.uv_DecalTex);
half4 decal2 = tex2D(_DecalTex2, IN.uv_DecalTex2);
c.rgb = lerp (c.rgb, decal.rgb, decal.a);
c.rgb = lerp (c.rgb, decal2.rgb, decal2.a);
c *= _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
Fallback "Diffuse"
}
Instead of using _DecalTex 1, 2, 3... would it be possible to define an array? I guess the simple solution is to define one that has say 10 textures, then only use the amount I need in each case.
Also, I've noticed that using greater than 7 textures starts to create some 'exceeds temporary register errors'
Yeah, I don't think you can do this. And the reason you get that error is because there are hard limits on the number of "things" a shader can handle, which I think is mainly hardware limited.
$$anonymous$$ind of an interesting solution is that you can create $$anonymous$$aterials with shaders written dynamically at runtime, but unfortunately it only works with Fixed-Function shaders: http://docs.unity3d.com/Documentation/ScriptReference/$$anonymous$$aterial.$$anonymous$$aterial.html
Hmm, this layering textures business works really well. I suppose I could just merge the textures together at run-time ins$$anonymous$$d. I wonder if it will be slow.
Your answer
Follow this Question
Related Questions
Creating a shader that shows a texture through a decal 0 Answers
Character Customization : techniques for brows, facial hair, tattoos, scars... 2 Answers
How do I build A texture from decals? 0 Answers
Detail to Decal Unity 5.x Standard Shader 0 Answers
Applying decals / textures to uneven surfaces runtime 1 Answer