- Home /
Changing material with custom shader while instantiating prefab at runtime leads to change in color of all the instances
Hey guys I created a custom shader
in project,then created a Material
with the same Shader
and assigned this Material
to the Prefab
. I have assigned a Texture
(an image with red color)to the Material
.What i want to do is ,at runtime when instantiating the prefab I want to change the color of material(Texture). Now what happens is when instantiating the prefab it changes the color of the texture but along with this all the previous instances get the same color,which i think is obvious as they all share the same Material
. Dont think my code is right,But just to begin with something::
var material=new Material(Shader.Find("Diffuse"));
material.shader=Shader.Find("Custom/PhongShader");
var sphereTexture=new Texture2D(2,2);
sphereTexture=sphereOfprefab.renderer.material.GetTexture("_MainTex");
for(var x:int=0;x<sphereTexture.width;x++)
{
for(var y:int=0;y<sphereTexture.height;y++)
{
sphereTexture.SetPixel(x,y,GameObject.Find("Plane"+spherename).renderer.material.color);
}
}
sphereTexture.Apply();
Here is my shader::
Shader "Custom/PhongShader"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainTint ("Diffuse Tint",Color)=(1,1,1,1)
_SpecularColor ("Specular Color",Color)=(1,1,1,1)
_SpecPower ("Specular Power",Range(0,30))=15
}
SubShader
{
Tags
{
"RenderType"="Opaque"
}
LOD 200
CGPROGRAM
#pragma surface surf Phong
float4 _SpecularColor;
sampler2D _MainTex;
float4 _MainTint;
float _SpecPower;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
inline fixed4 LightingPhong (SurfaceOutput s, fixed3 lightDir,half3 viewDir, fixed atten)
{
float diff =dot(s.Normal,lightDir);
float3 reflectionVector=normalize(2*s.Normal*diff-lightDir);
float spec=pow(max(0,dot(reflectionVector,viewDir)),_SpecPower);
float3 finalSpec=_SpecularColor.rgb*spec;
fixed4 c;
c.rgb=(s.Albedo* _LightColor0.rgb*diff)+(_LightColor0.rgb*finalSpec);
c.a=1.0;
return c;
}
ENDCG
}
FallBack "Diffuse"
}
Answer by sanks007 · Dec 24, 2013 at 10:13 AM
Got it done.. it was simple just changed this line sphereTexture=sphereOfprefab.renderer.material.GetTexture("_MainTex");
to sphereOfprefab.renderer.material.mainTexture=sphereTexture;
and its perfect.
Your answer
Follow this Question
Related Questions
2 materials/shaders 1 texture? 2 Answers
Cutout Material is not showing texture transparency? 0 Answers
Blending between arbitrary numbers of textures on the same material 0 Answers
Cheapest Way to Render Texture on Quad 0 Answers
White dots between two cubes? 0 Answers