Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
1
Question by Deathcalibur · Jul 19, 2013 at 11:18 PM · shadertexturedecal

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.

Comment
Add comment · Show 3
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Deathcalibur · Jul 20, 2013 at 12:14 AM 0
Share

Also, I've noticed that using greater than 7 textures starts to create some 'exceeds temporary register errors'

avatar image kromenak · Jul 20, 2013 at 04:14 AM 0
Share

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

avatar image Deathcalibur · Jul 20, 2013 at 05:06 AM 0
Share

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.

0 Replies

· Add your reply
  • Sort: 

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

16 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

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


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges