برمجة ال shader باستخدام ال CG الدرس الثاني

في المثال الأخير من الدرس السابق جعلنا لون المكعب ابيض بان يرجع ال fragment اللون

fixed4(1,1,1,1)

اما في هذا الدرس سوف نتعامل مع ال uniform نفس المثال السابق مع تعديل بسيط

pass
{
	CGPROGRAM
	#pragma vertex vert
	#pragma fragment frag

	uniform fixed4 col; // you can define col without write uniform

	float4 vert(float4 pos:POSITION):SV_POSITION
	{
		return UnityObjectToClipPos(pos);
	}

	fixed4 frag(void):COLOR
	{
		return col;
	}
	ENDCG
}

المتغير col هو uniform اي انه موحد بالنسبة لجميع ال vertices وال fragment ويكون تعيين قيمته قبل بداء تنفيذ ال shader .
في unity بامكانك تعديل قيمته بعدة طرق واسهلها عن طريق ال editor في ال inspector لخصائص ال material ولتستطيع القيام بذلك عليك بوضع متغير ال uniform في ال properties

Shader "test/shader1"
{
	Properties 
	{
                col ("put color of shader", Color) = (0.3, 0.3, 0.3, 1.0)
   	}
	subshader
	{
		pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			uniform fixed4 col;

			float4 vert(float4 pos:POSITION):SV_POSITION
			{
				return UnityObjectToClipPos(pos);
			}

			fixed4 frag(void):COLOR
			{
				return col;
			}
			ENDCG
		}
	}
}

الان بامكانك التعديل على قيمة col من خلال ال enditor
وبامكانك التعديل عليها برمجيا من unity دون الحاجة الى اضافة ال uniform الى ال properties

GetComponent<Renderer> ().sharedMaterial.SetColor("col",Color.yellow);//modifing on shared material it will effect on all objects used same material

التعديل على ال sharedMaterial سوف يعدل على جميع الكائنات التي تحوي نفس ال material بامكانك استبدالsharedMaterial ب material للتعديل على كائن ال material فقط .

int col=Shader.PropertyToID ("col");
GetComponent<Renderer> ().material.SetColor(col,Color.green);

بعض ال uniforms معرفة مسبقا في unity

   uniform float4 _Time, _SinTime, _CosTime; // time values
   uniform float4 _ProjectionParams;
      // x = 1 or -1 (-1 if projection is flipped)
      // y = near plane; z = far plane; w = 1/far plane
   uniform float4 _ScreenParams; 
      // x = width; y = height; z = 1 + 1/width; w = 1 + 1/height
   uniform float3 _WorldSpaceCameraPos;
   uniform float4x4 _Object2World; // model matrix
   uniform float4x4 _World2Object; // inverse model matrix 
   uniform float4 _WorldSpaceLightPos0; 
      // position or direction of light source for forward rendering

   uniform float4x4 UNITY_MATRIX_MVP; // model view projection matrix 
   uniform float4x4 UNITY_MATRIX_MV; // model view matrix
   uniform float4x4 UNITY_MATRIX_V; // view matrix
   uniform float4x4 UNITY_MATRIX_P; // projection matrix
   uniform float4x4 UNITY_MATRIX_VP; // view projection matrix
   uniform float4x4 UNITY_MATRIX_T_MV; 
      // transpose of model view matrix
   uniform float4x4 UNITY_MATRIX_IT_MV; 
      // transpose of the inverse model view matrix
   uniform float4 UNITY_LIGHTMODEL_AMBIENT; // ambient color