티스토리 뷰

유니티 코리아에 무한 감사!

나만 이해하된 돼~

 

Shader "URPTraining/URPBasic"
{
	Properties
	{
		_BaseColor("Tint Color", color) = (1,1,1,1)
		_BaseMap("Albedo(RGB)", 2D) = "white"{}
		_SubMap("Sub Texture", 2D) = "black"{}
		_Lerp("Lerp", Range(0,1)) = .5
	}

	SubShader
	{
		Tags
		{
			"RenderPipeline"="UniversalPipeline"
			"RenderType"="Opaque"
			"Queue"="Geometry"
		}

		Pass
		{
			Name "Universal Forward"

			Tags { "LightMode" = "UniversalForward" }

			HLSLPROGRAM
			#pragma prefer_hlslcc gles
			#pragma exclude_renderers d3d11_9x
			#pragma vertex vert
			#pragma fragment frag

			//cg shader는 .cginc를 hlsl shader는 .hlsl을 include하게 됩니다.
			#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"

			//vertex buffer에서 읽어올 정보를 선언합니다.
			//메모리에서 오브젝트 정보를 알아서 받아온다
			struct VertexInput
			{
				//float4 vertex : POSITION 로컬 공간 (모델 공간)의 정점 위치
				//float3 normal : NORMAL 버텍스의 노멀
				//float4 texcoord[n] : TEXCOORD[n] 버텍스의 UV 좌표.
				//float4 tangent : TANGENT 메시에서 계산된 또는 import된 탄젠트 값
				//float4 color : COLOR 버텍스의 컬러값.

				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
			};

			//보간기를 통해 버텍스 셰이더에서 픽셀 셰이더로 전달할 정보를 선언합니다.
			//Fragment Shader가 받아서 사용할 메쉬 정보를 저장하기 위한 구조체 선언.
			//Fragment Shader는 VertexOutput 형식의 데이터를 받아 픽셀 값을 결정한다.
			struct VertexOutput
			{
				//SV_POSITION에서 SV는 값이 수정됐다는 의미.
				float4 vertex : SV_POSITION;
				float2 uv : TEXCOORD0;
			};

			//버텍스 셰이더
			VertexOutput vert(VertexInput v)
			{
				VertexOutput o;
				//반드시 공간 변환 필요 (MVP)
				o.vertex = TransformObjectToHClip(v.vertex.xyz);
				
				o.uv = v.uv;
				//버텍스 쉐이더에서 Tiling과 Offset 계산 가능
				//o.uv = v.uv *_ST.xy +_ST.zw;
				//이 경우 float4 _BaseMap_ST의 선언은 버텍스 쉐이더보다 상단에 위치

				return o;
			}

			float4 _BaseColor;
			float _Lerp;

			//텍스처 UV
			//ST는 텍스처의 Tiling과 Offset을 의미
			float4 _BaseMap_ST;

			//텍스처 샘플링에는 2가지 방법이 있다.
			
			/////////////////////////////////
			//Coupled textures and samplers//
			/////////////////////////////////
			/*
			sampler2D _BaseMap;
			sampler2D _SubMap;
			//픽셀 셰이더
			half4 frag(VertexOutput i) : SV_Target
			{
				float2 uv = i.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw;
				float2 uv2 = i.uv.xy;
				float4 f = tex2D(_BaseMap, uv);
				float4 s = tex2D(_SubMap, uv2);
				f = lerp(f, s, .5);
				return f * _BaseColor;
			}
			*/

			//////////////////////////////////
			//Separate textures and samplers//
			//////////////////////////////////
			
			Texture2D _BaseMap;
			Texture2D _SubMap;
			//Tex2D 타입의 변수명 앞에 sampler를 추가한 형태
			SamplerState sampler_BaseMap;

			float4 _SubMap_ST;

			//픽셀 셰이더
			half4 frag(VertexOutput i) : SV_Target
			{
				float2 uv = i.uv.xy * _BaseMap_ST.xy + _BaseMap_ST.zw;
				float2 uv2 = i.uv.xy * _SubMap_ST.xy + _SubMap_ST.zw;
				float4 f = _BaseMap.Sample(sampler_BaseMap, uv);
				float4 s = _SubMap.Sample(sampler_BaseMap, uv2);
				f = lerp(f, s, _Lerp);
				return f * _BaseColor;
			}

			ENDHLSL
		}
	}
}
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함