[24.04.04]Unity - Shader(2)

손지·2024년 4월 3일
0

Unity

목록 보기
34/44

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"
}
profile
게임 개발자가 될사람

0개의 댓글