// 이 셰이더는 코드에 미리 정의된 색으로 메쉬 형태를 채웁니다.
Shader "Example/URPUnlitShaderBasic"
{
// 유니티 셰이더의 프로퍼티 블록입니다. 이 예제에서 이 블록은 비어 있습니다
// 왜냐하면 출력 색상이 프래그먼트 셰이더 코드에 미리 정의되어 있기 때문입니다.
Properties
{
_BaseColor("Base Color", Color) = (1, 1, 1, 1)
_BaseMap("Base Map", 2D) = "white"
}
// 셰이더 코드를 포함하고 있는 SubShader 블록입니다.
SubShader
{
// SubShader 태그는 언제, 그리고 어떤 조건 하에서 SubShader 블록이나
// 패스가 실행될지 정의합니다.
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }
Pass
{
// HLSL 코드 블록입니다. 유니티 SRP는 HLSL 언어를 사용합니다.
HLSLPROGRAM
// 이 줄은 버텍스 셰이더의 이름을 정의합니다.
#pragma vertex vert
// 이 줄은 프래그먼트 셰이더의 이름을 정의합니다.
#pragma fragment frag
// Core.hlsl 파일에는 자주 사용되는 HLSL 매크로와 함수의 정의가 포함되어 있으며,
// 또한 다른 HLSL 파일(예: Common.hlsl, SpaceTransforms.hlsl 등)에 대한 #include 참조를 포함하고 있습니다.
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
// 구조체 정의는 그것이 어떤 변수들을 포함하고 있는지 정의합니다.
// 이 예제는 Attributes 구조체를 버텍스 셰이더의 입력 구조체로 사용합니다.
struct Attributes
{
// positionOS 변수는 오브젝트 공간에서의 버텍스 위치를 포함하고 있습니다.
float4 positionOS : POSITION;
// uv 변수는 주어진 버텍스에 대한 텍스쳐에서의 UV 좌표를 포함하고 있습니다.
float2 uv : TEXCOORD0;
};
struct Varyings
{
// 이 구조체 안의 위치는 SV_POSITION semantic을 가져야 합니다.
float4 positionHCS : SV_POSITION;
// uv 변수는 주어진 버텍스에 대한 텍스쳐에서의 UV 좌표를 포함하고 있습니다.
float2 uv : TEXCOORD0;
};
// 이 매크로는 _BaseMap을 Texture2D 객체로 선언합니다.
TEXTURE2D(_BaseMap);
// 이 매크로는 _BaseMap 텍스쳐에 대한 샘플러를 선언합니다.
SAMPLER(sampler_BaseMap);
// Unity 셰이더를 SRP Batcher와 호환되게 만들기 위해서,
// Material과 관련된 모든 프로퍼티를 UnityPerMaterial이라는 이름의
// 단일 CBUFFER 블록 내에 선언하십시오.
CBUFFER_START(UnityPerMaterial)
// 다음 줄은 _BaseColor 변수를 선언하여, 이를
// 프래그먼트 셰이더에서 사용할 수 있게 합니다.
float4 _BaseMap_ST;
CBUFFER_END
// Varyings 구조체에서 정의된 프로퍼티를 가진 버텍스 셰이더의 정의입니다.
// vert 함수의 유형은 반환하는 유형(구조체)과 일치해야 합니다.
Varyings vert(Attributes IN)
{
// Varyings 구조체를 사용하여 출력 객체(OUT)를 선언합니다.
Varyings OUT;
// TransformObjectToHClip 함수는 버텍스 위치를 오브젝트 공간에서 동차 공간으로 변환합니다.
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
// TRANSFORM_TEX 매크로는 타일링과 오프셋 변환을 수행합니다.
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
// 출력을 반환합니다.
return OUT;
}
// 프래그먼트 셰이더의 정의입니다.
half4 frag(Varyings IN) : SV_Target
{
// SAMPLE_TEXTURE2D 매크로는 주어진 샘플러로 텍스쳐를 샘플링합니다.
half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
return color;
}
ENDHLSL
}
}
}
Shader "HSH/UpgradeColorEffect"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
Cull Off
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
};
struct Varyings
{
float4 positionHCS : SV_POSITION;
float2 uv : TEXCOORD0;
float4 screenPos : TEXCOORD1;
float4 color : COLOR;
};
TEXTURE2D(_MainTex);
SAMPLER(sampler_MainTex);
CBUFFER_START(UnityPerMaterial)
float4 _MainTex_ST;
CBUFFER_END
Varyings vert(Attributes IN)
{
Varyings OUT;
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
OUT.screenPos = ComputeScreenPos(OUT.positionHCS);
OUT.color = IN.color;
return OUT;
}
half4 frag(Varyings IN) : SV_Target
{
half4 textureColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
return textureColor * IN.color;
}
ENDHLSL
}
}
}
'Unity3D > Shader' 카테고리의 다른 글
Shader) 2D 흔들리는 깃발 효과 (0) | 2023.09.26 |
---|---|
Shader) HLSL 아래로 흐르는 셰이더 구현 (0) | 2023.09.22 |
Unity) [Shader] 셰이더를 통한 물 표현 (0) | 2023.03.23 |
Unity) [Shader] 2Pass 알파블랜딩으로 Dissolve, 투명 효과 구현 (0) | 2023.03.22 |
Unity) [Shader] Diffuse Warping 기법 (0) | 2023.03.22 |