티스토리 뷰

docs.unity3d.com/kr/530/Manual/SL-CullAndDepth.html

 

유니티 - 매뉴얼: ShaderLab: Culling & Depth Testing

ShaderLab: Culling & Depth Testing 컬링은 시점과 반대편을 향한 폴리곤을 렌더링하지 않는 최적화입니다. 모든 다각형은 앞면과 뒷면이 있습니다. 컬링은 오브젝트의 대부분이 닫혀있는 사실을 이용합

docs.unity3d.com

쉐이더보다 다른 쪽을 공부하고 있었는데 그냥 간단해 보이길래 한 번 만들어 볼까?

싶어서 쉐이더 코드를 끄적였다.

역시 마음 먹은 건 쉽게 공부하게 되지 않는 것 같다.

 

Properties
	{
		_MainTex("Texture", 2D) = "white" {}
		_Color("Color", Color) = (0,0,0,0)
	}
		SubShader
		{
			Tags { "Queue" = "Transparent" }
			LOD 100

			Pass
			{
				Cull Off
				ZWrite Off
				ZTest Always

				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#include "UnityCG.cginc"

				struct appdata
				{
					float4 vertex : POSITION;
				};

				struct v2f
				{
					float4 vertex : SV_POSITION;
				};

				float4 _Color;

				v2f vert(appdata v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					return _Color;
				}

				ENDCG
			}

			Pass
			{
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag


				#include "UnityCG.cginc"

				struct appdata
				{
					float4 vertex : POSITION;
					float2 uv : TEXCOORD0;
				};

				struct v2f
				{
					float2 uv : TEXCOORD0;
					float4 vertex : SV_POSITION;
				};

				sampler2D _MainTex;
				float4 _MainTex_ST;

				v2f vert(appdata v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.uv = TRANSFORM_TEX(v.uv, _MainTex);

					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = tex2D(_MainTex, i.uv);

					return col;
				}
				ENDCG
			}


		}

그런데 버텍스 프래그먼트 쉐이더 코드로 작성된 자료(나 그래프 쉐이더로 만드는 법)만 나와서 아쉽네하다가

서피스 쉐이더로 충분히 바꿔서 쓸 수 있겠다 생각하고 도전해보려고 했다. 그런데

 

뭔가 안돼

 

 

 

youtu.be/EthjeNeNTsM

 

이 동영상을 보고 만들어 보려했지만 도저히 뒤에 가려진 객체가 비쳐보이지 않는 것이다.

작은 해프닝인데 커스텀 쉐이더를 가려질 객체에 추가하는 거였는데 가리는 객체에 추가하고 만들고 있었다.

 

"존나 병신이네 낰ㅋㅋ"

 

구현 방법은

 

2Pass를 사용하는 것이다.

 

첫번째 Pass는 앞의 객체에 가려지지 않도록 Zwrite Off 해주는 것.

다른 객체와의 전후관계를 계산하지 않게 되어 가려지지 않는다.

Queue 또한 반투명 객체 순번으로 설정. ( Tags { "RenderType" = "Transparent" "Queue" = "Transparent" })

다른 객체보다 나중에 그려지면 항상 위에 그려지게 된다.

 

두번째 Pass는 다시 앞의 객체에 가려지도록 Zwrite On 해준다.

 

 

면 되는 줄 알았는데 아니었다.

 

참고한 코드와의 차이를 찾았는데

"ZTest" 라는 것이다.

 

렌더링 단계에서 Culling & Depth Testing

 

 

누구나 아는 쉐이더인데 블로그에 남겨야겠다 생각하게 된 부분;

 

ZTest

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

뭐 이런 종류가 있는데

그리려는 픽셀의 입장에서 자신의 Z 버퍼가 겹쳐진 픽셀의 버퍼보다 작아야, 보다 카메라에 가깝다는 의미가 되니,

기본으로는 ZTest LEqual이 암시 되어있는 것이다.

 

따라서 가려진 부분을 그릴 첫번째 Pass는 버퍼의 작고 큼에 영향을 받지않고 항상 그려지는

'Always' 를,

가려지지 않은 부분을 그릴 두번째 Pass는 기본값인 'LEqual'나 'Less'를 사용하는 것이다. 

 

	Properties
	{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Albedo (RGB)", 2D) = "white" {}
	}
		SubShader
	{
		Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
		LOD 100

		Cull Off
		ZWrite Off
		ZTest Always

		CGPROGRAM
		#pragma surface surf _nolight noambient noshadow

		struct Input
		{
			float4 color:COLOR;
		};

		float4 _Color;

		void surf(Input IN, inout SurfaceOutput o)
		{
		}

		fixed4 Lighting_nolight(SurfaceOutput s, float3 lightDir, float atten) {
			return _Color;
		}

		ENDCG
			Cull Back
		ZWrite On
		ZTest Less

		CGPROGRAM
		#pragma surface surf Lambert alpha:fade
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input
		{
			float2 uv_MainTex;
		};

		void surf(Input IN, inout SurfaceOutput o)
		{
			fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}

		ENDCG
	}
		FallBack "Legacy Shaders/Transparent/VertexLit"

 

 

 

뒤에 가려진 부분이 단색으로 그려지게 된다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함