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

بعد الخروج من برنامج ال vertex هناك عمليات وحسابات تتم قبل الوصول الى برنامج ال fragment  ومن هذه العمليات ال culling and depth test
نكتب هذه الأوامر داخل ال pass  

CULL

لتحديد الوجه الذي لا تريد رسمه …
فقط للمعلومية لكل primitive geometry هناك front face و back face
افتراضيا :
front face وهو الوجه الذي نقاطه متصلة باتجاه عقارب الساعة clockwise
back face وهو الوجه الذي نقاطه بعكس عقارب الساعة counter clockwise

Cull Back | Front | Off
Back Don’t render polygons facing away from the viewer (default).
Front Don’t render polygons facing towards the viewer. Used for turning objects inside-out.
Off Disables culling - all faces are drawn. Used for special effects.
pass
{
	CULL OFF
	CGPROGRAM

	ENDCG
}

ZWrite

ZWrite On | Off
If you’re drawng solid objects, leave this on. If you’re drawing semitransparent effects, switch to ZWrite Off. For more details read below.

On تعني انه سوف يتم كتابة البكسل في ال depth buffer في حال نجح اختبار ال ZTEST.
في حال جعلتها OFF وتم رسمها فان اي عنصر آخر يتم رسمه بعدها سوف يتم رسمه فوقها (اذا تشابهت مواقع البكسلات) .

ZTest

ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

في حال كان هناك بكسل في نفس الموقع يتم عمل اختبار ال depth لتحديد هل يتم تنفيذه ام لا ،  Default is LEqual وتعني اذا اقل عمقا او مساو له

ترتيب ال  rendering

بامكانك تحديد اي shader يتم تنفيذه قبل الآخر بسطر واحد كما في المثال

SubShader
{
    Tags { "Queue" = "Transparent" }
}

وهناك خمسة تصنيفات في الترتيب

Background (1000) - this render queue is rendered before any others. You’d typically use this for things that really need to be in the background.
Geometry (default) (2000) - this is used for most objects. Opaque geometry uses this queue.
AlphaTest (2450) - alpha tested geometry uses this queue. It’s a separate queue from Geometry one since it’s more efficient to render alpha-tested objects after all solid ones are drawn.
Transparent(3000) - this render queue is rendered after Geometry and AlphaTest, in back-to-front order. Anything alpha-blended (i.e. shaders that don’t write to depth buffer) should go here (glass, particle effects).
Overlay(4000) - this render queue is meant for overlay effects. Anything rendered last should go here (e.g. lens flares).

كل تصنيف وله رقم وبامكانك الانتقال منه للرقم التالي

Tags { "Queue" = "Geometry+1" }
Tags { "Queue" = "Geometry+500" }// = Tags { "Queue" = "AlphaTest+50" }

 

أمثلة عالطاير

plane ذو وجهين على كل وجه texture مختلف

pass
{
	CULL OFF
	CGPROGRAM
	#pragma vertex vert
	#pragma fragment frag

	struct VertexInput
	{
		float4 pos:POSITION;
		fixed4 norm:NORMAL;
		fixed2 tex:TEXCOORD0;
	};

	struct VertexOutput
	{
		float4 pos:SV_POSITION;
		fixed4 norm:NORMAL;
		fixed2 tex:TEXCOORD0;
	};

	uniform sampler2D tex,tex2;

	VertexOutput vert(VertexInput vi)
	{
		VertexOutput vo;
		vo.pos=UnityObjectToClipPos(vi.pos);
		vo.norm=mul(UNITY_MATRIX_T_MV,fixed4(vi.norm.xyz,0));
		vo.tex=vi.tex;
		return vo;
	}

	fixed4 frag(VertexOutput vo):COLOR
	{
		if(vo.norm.z>=0)
			return tex2D(tex,vo.tex);
		else
			return tex2D(tex2,vo.tex);
	}
	ENDCG
}

 

مثال رسم background

subshader
{
	Tags { "Queue" = "BACKGROUND" } 
	pass
	{
		ZWRITE OFF
		CGPROGRAM
		ENDCG
	}
}

 

مثال رسم overlay

subshader
{
	Tags { "Queue" = "OVERLAY" } 
	pass
	{
		ZWRITE OFF
		ZTEST ALWAYS
		CGPROGRAM
                ENDCG
        }
}