카테고리 없음

Unity_HLSL_Transparent

zelkova 2021. 4. 28. 10:53

<목차로 돌아가기>

 

 

투명도 지정

 

 

더보기
Shader "StudySRP/Catlike1"
{
	Properties{
		_BaseMap("Texture", 2D) = "white" {} //Unity의 표준 흰색 텍스처를 기본값으로 사용합니다. 오류방지.
		_BaseColor("Color", Color) = (1.0, 1.0, 1.0, 1.0)
		[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend", Float) = 1 //편집을 쉽게 하기위한 블랜드 모드 열거형
		[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend", Float) = 0 //편집을 쉽게 하기위한 블랜드 모드 열거형
		[Enum(Off, 0, On, 1)] _ZWrite("Z Write", Float) = 1//켜기 끄기 토글을 만듭니다.
	}


	SubShader{
		Pass {
			Blend[_SrcBlend][_DstBlend] //셰이더 이전의 오래된 구문임.
			ZWrite[_ZWrite] ///깊이를 쓰지 않음.

			HLSLPROGRAM
				#include "Catlike1Pass.hlsl"
				#include "UnityInput.hlsl"
				#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl"

				#define UNITY_MATRIX_M unity_ObjectToWorld
				#define UNITY_MATRIX_I_M unity_WorldToObject
				#define UNITY_MATRIX_V unity_MatrixV
				#define UNITY_MATRIX_VP unity_MatrixVP
				#define UNITY_MATRIX_P glstate_matrix_projection

				#ifndef CUSTOM_UNITY_INPUT_INCLUDED
					#define CUSTOM_UNITY_INPUT_INCLUDED
					CBUFFER_START(UnityPerDraw)
						float4x4 unity_ObjectToWorld;
						float4x4 unity_WorldToObject;
						float4 unity_LODFade;
						real4 unity_WorldTransformParams;
					CBUFFER_END

					float4x4 unity_MatrixVP;
					float4x4 unity_MatrixV;
					float4x4 glstate_matrix_projection;
				#endif

				#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl" 
				#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl"

				TEXTURE2D(_BaseMap); // 셰이더 리소스
				SAMPLER(sampler_BaseMap); // 셰이더 리소스_Unity가 자동으로 제공하는 샘플러 상태의 이름

				UNITY_INSTANCING_BUFFER_START(UnityPerMaterial) 
					UNITY_DEFINE_INSTANCED_PROP(float4, _BaseMap_ST)// 텍스처의 타일링 및 오프셋을 사용할 수 있도록
					UNITY_DEFINE_INSTANCED_PROP(float4, _BaseColor) 
				UNITY_INSTANCING_BUFFER_END(UnityPerMaterial)


				#pragma multi_compile_instancing 
				#pragma vertex vert
				#pragma fragment frag

				#ifndef CUSTOM_UNLIT_PASS_INCLUDED
					#define CUSTOM_UNLIT_PASS_INCLUDED	
				#endif


				struct Attributes {
					float3 positionOS : POSITION;
					float2 baseUV : TEXCOORD0; //텍스쳐 공간 차원 선언
					UNITY_VERTEX_INPUT_INSTANCE_ID
				};

				struct Varyings {
					float4 positionCS : SV_POSITION;
					float2 baseUV : VAR_BASE_UV;// 좌표전달
					UNITY_VERTEX_INPUT_INSTANCE_ID 
				};

				Varyings vert(Attributes input) {
					Varyings output;
					UNITY_SETUP_INSTANCE_ID(input);
					UNITY_TRANSFER_INSTANCE_ID(input, output); 
					float3 positionWS = TransformObjectToWorld(input.positionOS.xyz);
					output.positionCS = TransformWorldToHClip(positionWS);
					float4 baseST = UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseMap_ST);
					output.baseUV = input.baseUV * baseST.xy + baseST.zw; //스케일은 xy에, 오프셋은 zw에 저장된 배율과 오프셋을 적용할 수 있습니다.
					return output;
				}

				float4 frag(Varyings input) : SV_TARGET{
					UNITY_SETUP_INSTANCE_ID(input);
					float4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, input.baseUV); //여기에서 텍스처를 샘플링함.
					float4 baseColor = UNITY_ACCESS_INSTANCED_PROP(UnityPerMaterial, _BaseColor); // 색상은 여기다 담고
					return baseMap * baseColor; // 두개의 동일한 크기의 벡터를 곱하면 일치하는 구성요소가 곱해짐. RxR, GxG..
				} 
			ENDHLSL
		}
	}
}

 

알파 클리핑

공부하면서 정리중.. 더럽게 어렵네 ;ㅁ;...

나머지는 내일

반응형