Properties: 쉐이더에 사용할 속성을 정의합니다.
여기서는 _colorR, _colorG, _colorB, _Metallic, _Glossiness를 정의하고 각각의 기본값을 설정합니다.
각 속성은 쉐이더에서 사용되는 변수입니다.
SubShader: 서브 쉐이더를 정의합니다. 이 부분에서 쉐이더 코드를 작성합니다.
CGPROGRAM: 쉐이더 코드가 시작됨을 나타냅니다. 이 부분에서 쉐이더 코드가 작성됩니다.
struct Input: 입력 구조체를 정의합니다. 이 구조체는 쉐이더의 입력을 나타냅니다. 여기서는 색상 정보를 받습니다.
각 속성에 대한 변수를 정의합니다. 이 변수들은 쉐이더 코드에서 사용됩니다.
void surf(Input In, inout SurfaceOutputStandard o): 주요 작업이 이루어지는 함수입니다. 이 함수는 입력으로 색상 정보를 받고, 출력으로 SurfaceOutputStandard 구조체를 반환합니다. 여기서는 입력으로 받은 색상 정보를 사용하여 Albedo (반사되는 색), Metallic (금속성), Smoothness (광택)을 설정합니다.
ENDCG: CGPROGRAM 블록의 끝을 나타냅니다.
ShaderColor.shader
Shader "SJ/01_Color" //고를때 정할 파일명
{
Properties //속성값
{
_colorR ("Color R", Range(0, 1)) = 1
//_colorR가 변수명은 아니다.굳이 따지자면 내부와 외부의 중간쯤에 있다.
_colorG ("Color G", Range(0, 1)) = 1
_colorB ("Color B", Range(0, 1)) = 1
_Metallic ("Metallic", Range(0, 1)) = 1
//거칠기
_Glossiness ("Glossiness", Range(0, 1)) = 1
}
SubShader
{
CGPROGRAM
#pragma surface surf Standard
// 내가 지금부터 서피스 쉐이더를 받지만 중간에 내가 변경한 작업들만 적용을 시켜줘라 그 함수명이 surf 다 라고 하는것.
struct Input
// 쉐이더에서 사용되는 입력 데이터를 정의하는 구조체, 여기서는 주로 표면의 색상 정보를 받는다.
{
float4 color : COLOR;
//float4 좌표에서도 쓰이고 색깔에서도 쓰인다 RGBA, XYZW 도 되낟.
// : = Sementic 이라고 한다.
//Semantic(의미론적)은 쉐이더 프로그래밍에서 변수나 구조체의 사용 목적이나 의미를 나타내는 특별한 지시어입니다.
//이는 쉐이더 코드를 해석하고 실행하는 데 필요한 정보를 제공합니다. 여기서 :COLOR는 Semantic(의미론적) 중 하나입니다. 이는 해당 변수가 쉐이더에서 색상 정보를 나타낸다는 것을 나타냅니다.
};
//실제 변수가 저장하는 곳이다.
fixed _colorR;
fixed _colorG;
//쉐이더는 실수만 처리하고, 쉐이더는 특이하게 부호비트 포함해서 11비트 다.
fixed _colorB;
//버텍스 한개 에 들어있는 위치 UV 노멀 컬러 를 저장한다.
half _Metallic;
//half가 엔비디아 그래픽카드 기준으로 float보다 두배가 빠르다.
//half 기준으로 그래픽카드가 연산하기 때문이다.
half _Glossiness;
//struct SurfaceOutputStandard
//{
// fixed3 Albedo; // 반사되는 색
// fixed3 Normal; // 법선
// half3 Emission; // 발산되는 색
// half Metallic; // 0=메탈 영향 없음, 1=메탈
// half Smoothness; // 0=거칠게, 1=부드럽게
// half Occlusion; // 차폐로 인한 환경광의 영향도 (기본 1)
// fixed Alpha; // 투명도
//};
/*
이 줄은 Surface Shader에서 가장 중요한 함수인 surf를 선언합니다.
void: 함수가 어떤 값을 반환하지 않음을 나타냅니다.
surf: Surface Shader에서 사용되는 표준 함수 이름입니다. 이 함수는 표면의 특성을 정의하고, 이를 렌더링에 적용합니다.
(Input In, inout SurfaceOutputStandard o): 함수의 매개변수입니다.
Input In: 쉐이더의 입력 데이터를 나타냅니다. 여기서는 주로 색상 정보가 포함됩니다.
inout SurfaceOutputStandard o: 쉐이더의 출력 데이터를 나타냅니다. 이는 표면의 특성을 나타내며, 이 함수에서 수정됩니다.
"inout" 키워드는 해당 매개변수가 함수 내부에서 읽히고 쓰여질 수 있음을 나타냅니다. 이 매개변수를 통해 표면의 색상, 반사 특성 등을 결정하고, 이를 렌더링에 사용됩니다.
*/
void surf(Input In, inout SurfaceOutputStandard o)
{
o.Albedo = float3(_colorR, _colorG, _colorB);
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
}
ENDCG
//범위 의 마지막
}
}
TextureRatio.shader
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//[ExecuteInEditMode]
public class TextureRatio : MonoBehaviour
{
[SerializeField, Range(0f, 1f)] private float ratio = 0f;
private MeshRenderer mr = null;
private void Awake()
{
mr = GetComponent<MeshRenderer>();
}
private void Update()
{
mr.material.SetFloat("_ratio", ratio);
}
}
ShaderTexture.shader
Shader "KCH/02_ShaderTexture"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "black" {}
//_MainTex 는 반드시 있어야한다.
//2D = Texture2D를 가져온다. = black 는 색깔을 지정해주는것이다.
_MainTexTo ("Albedo (RGB)", 2D) = "black" {}
_ratio ("Ratio", Range(0, 1)) = 0
}
SubShader
{
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
//그림자
//이거를 안하기위해 URP 라는것이.. 생겼다
sampler2D _MainTex;
sampler2D _MainTexTo;
half _ratio;
struct Input
{
float2 uv_MainTex;
};
//UV 가 부위별로 가져오기 때문에 여러개가 될수도 있지만 uv_MailTex가 반드시 있어야한다. 암튼 없으면 안됨
//UV를 가져온다 .
void surf (Input IN, inout SurfaceOutputStandard o)
{
float4 texColor = tex2D (_MainTex, IN.uv_MainTex);
float4 texToColor = tex2D (_MainTexTo, IN.uv_MainTex);
//o.Albedo = texColor.rgb; // 여기서 색깔의 순서를 마음대로 바꿀수 있는데
//이러한 기법을 Swizzling(스위즐링) 이라고 한다.
//o.Emission = texColor.r * 0.2989 + texColor.g * 0.5870 + texColor.b * 0.1140;
o.Emission = lerp(texColor.rgb, texToColor.rgb, _ratio);
//참고로 자료형은 무조건 float 이기 때문에 f를 붙여주지 않아도 된다.
/*if(texColor.a > 0)
{
o.Emission = texColor.rgb;
}
else
{
o.Emission = texToColor.rgb;
}*/
/*if(texColor.g > 0.8 && texColor.r < 0.5 && )
{
o.Emission = half3(0, 1, 0);
}
else
{
o.Emission = half3(0, 0, 0);
}*/
}
ENDCG
}
FallBack "Diffuse"
}