Hi,
I’m having trouble trying to change the vertex color from my script. I have a shader that I thought was correctly written to do what I’m trying to accomplish, but I must have an error in it somewhere. The script works, but the game objects that I’m trying to change the color of, remain the same color.
Here is my shader:
Shader "My Shaders/Normal Maps/OptimizedNormal"
{
Properties
{
_Color( "ColorTint", Color ) = ( 1.0, 1.0, 1.0, 1.0 )
_BumpMap( "NormalTexture", 2D ) = "bump" {}
_BumpDepth( "BumpDepth", Range( 0.0, 1.0 ) ) = 1
_SpecColor( "SpecularColor", Color ) = ( 1.0, 1.0, 1.0, 1.0 )
_Shininess( "Shininess", float ) = 10
}
SubShader
{
Pass
{
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
//user defined variables
uniform fixed4 _Color;
uniform sampler2D _BumpMap;
uniform fixed _BumpDepth;
uniform half4 _BumpMap_ST;
uniform fixed4 _SpecColor;
uniform half _Shininess;
//unity defined variables
uniform half4 _LightColor0;
//base input structs
struct vertexInput
{
half4 vertex : POSITION;
half3 normal : NORMAL;
half4 texcoord : TEXCOORD0;
half4 tangent : TANGENT;
};
struct vertexOutput
{
half4 pos : SV_POSITION;
half4 tex : TEXCOORD0;
fixed4 lightDirection : TEXCOORD1;
fixed3 viewDirection : TEXCOORD2;
fixed3 normalWorld : TEXCOORD3;
fixed3 tangentWorld : TEXCOORD4;
fixed3 binormalWorld : TEXCOORD5;
};
//vertex function
vertexOutput vert( vertexInput v )
{
vertexOutput o;
o.normalWorld = normalize( mul( half4( v.normal, 0.0 ), _World2Object ).xyz );
o.tangentWorld = normalize( mul( _Object2World, v.tangent ).xyz );
o.binormalWorld = normalize( cross( o.normalWorld, o.tangentWorld ) * v.tangent.w );
half4 posWorld = mul( _Object2World, v.vertex );
o.pos = mul( UNITY_MATRIX_MVP, v.vertex );
o.tex = v.texcoord;
o.viewDirection = normalize( _WorldSpaceCameraPos.xyz - posWorld.xyz );
half3 fragmentToLightSource = _WorldSpaceLightPos0.xyz - posWorld.xyz;
o.lightDirection = fixed4(
normalize( lerp( _WorldSpaceLightPos0.xyz, fragmentToLightSource, _WorldSpaceLightPos0.w ) ),
lerp( 1.0, 1.0/length( fragmentToLightSource ), _WorldSpaceLightPos0.w ) );
return o;
}
//fragment function
fixed4 frag( vertexOutput i ) : COLOR
{
//texture Maps
fixed4 texN = tex2D( _BumpMap, i.tex.xy * _BumpMap_ST.xy + _BumpMap_ST.zw );
//unPackNormal function
fixed3 localCoords = fixed3( 2.0 * texN.ag - float2( 1.0, 1.0 ), _BumpDepth );
//normal transpose matrix
fixed3x3 local2WorldTranspose = fixed3x3(
i.tangentWorld,
i.binormalWorld,
i.normalWorld
);
//calculate normal direction
fixed3 normalDirection = normalize( mul( localCoords, local2WorldTranspose ) );
//Lighting
//dot product
fixed nDotL = saturate( dot( normalDirection, i.lightDirection.xyz ) );
fixed3 diffuseReflection = i.lightDirection.w * _LightColor0.xyz * nDotL;
fixed3 specularReflection = diffuseReflection * _SpecColor.xyz * pow( saturate( dot( reflect( -i.lightDirection.xyz, normalDirection ), i.viewDirection ) ), _Shininess);
fixed3 lightFinal = UNITY_LIGHTMODEL_AMBIENT.xyz + diffuseReflection + ( specularReflection );
return fixed4( lightFinal * _Color.rgb, 1.0 );
}
ENDCG
}
}
//Fallback "Diffuse"
}
I thought that declaring _Color as uniform allows me to change the default value of the verts from my C# script, but the objects remain white. This is the C# script that I wrote for changing the verts color:
void Start ()
{
GameObject[] gos;
gos = GameObject.FindGameObjectsWithTag( "Container" );
int colorNumber = 0;
print ("here1");
foreach( GameObject go in gos )
{
var mf = go.GetComponent<MeshFilter>();
var colors = new Color[ mf.sharedMesh.vertexCount];
print ("here2");
Debug.Log(colors.Length);
if( colorNumber == 0 )
{
print ("here3");
for(var i = 0; i < colors.Length; i++)
{
colors *= new Color( 1, 0, 0, 1 );*
-
}*
-
mf.mesh.colors = colors;*
-
colorNumber = 1;*
-
}*
-
if( colorNumber == 1 )*
-
{*
-
print ("here4");*
-
for(var i = 0; i < colors.Length; i++)*
-
{*
_ colors = new Color( 0, 1, 0, 1 );_
* }*
* mf.mesh.colors = colors;*
* colorNumber = 2;*
* }*
* if( colorNumber == 2 )*
* {*
* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0, 0, 1, 1 );_
* }*
* mf.mesh.colors = colors;*
* colorNumber = 3;*
* }*
* if( colorNumber == 3 )*
* {*
* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0.5f, 0.25f, 0, 1 );
* }
mf.mesh.colors = colors;
colorNumber = 4;
}*_
* if( colorNumber == 4 )*
* {*
* for(var i = 0; i < colors.Length; i++)*
* {*
_ colors = new Color( 0.3f, 0, 0.2f, 1 );
* }
mf.mesh.colors = colors;
colorNumber = 0;
}
}
}*
Both the shader and C# scripts run without error, but like I said, the color of the game object just remains as the default white that I set in the top of the shader.
Does anyone know where I’m going wrong? I have a feeling that I haven’t got something right in the shader.
Any help is much appreciated. Thanks_