쉐이더 - ShaderLab
2023. 8. 31.

쉐이더

-화면에 출력하는 픽셀을 정해주는 함수

=> 다양한 재질을 표현할 수 있는 방법

 

 

랜더링 파이프라인

-3d장면을 구성하기 위해 2d 화면에 구현하는 일련의 과정

 

오브젝트 데이터

-메쉬가 있다 : 메쉬 안에 정점들이 있다.(Vertex로 이루어진 물체의 데이터 값)

 

Vertext 셰이더

 

월드좌표로 옮겨진 Vertex 값들은 카메라를 중심의 상대적 위치로 다시 한번 연산된다.

-카메라 좌표 안으로 들어와야 랜더링이 가능하다(: Rasterization O, 픽셀화O)

 

 

-Rasterization : 픽셀화- 모니터에서 표현될 때 어느 픽셀로 표현 될것인가.

 

픽셀 쉐이더

- 텍스처 음영 담당. 조명, 텍스처, 그림자, 특수 효과 등을 연산

모니터에서 표현되는 색은 가산혼합으로 만들어진다. 한개의 픽셀은 3개의 서브 픽셀로 이루어진다.

이 한 픽셀의 색을 결정하는 코드를 픽셀 쉐이더라고 부른다.

 

유니티 쉐이더는 쉐이더 랩이라는 스크립트 언어를 사용한다.

 

Surface Shader

-ShaderLab 스크립트와 CG 쉐이더 코드를 같이 사용하는 방법이다.

 

create>shader> standarad surface shader

shader를 material에 넣은 후 material을 오브젝트에 넣어주었다.

 

비주얼 스튜디오 코드로 열어주었다.

-크게 Properties와 SubShader로 나눌 수 있다.

-프로퍼티에 정의된 것은 인스펙터에 표현된다.

-CGPROGRAM~ENDCG 까지가 surface shader 영역이다.

 

 

https://docs.unity3d.com/kr/530/Manual/SL-Properties.html

 

ShaderLab: 프로퍼티(Properties) - Unity 매뉴얼

셰이더는 Unity의 머티리얼 인스펙터에서 아티스트의 설정을 위한 파라미터 리스트를 정의할 수 있습니다. 셰이더 파일의 프로퍼티 블록이 이를 정의합니다.

docs.unity3d.com

인터페이스 만들기

sampler - 텍스처를 받아 색상(Float4)으로 나타낼 수 없다. 

 

인터페이스 만들기

https://docs.unity3d.com/kr/2021.3/Manual/SL-SurfaceShaders.html

 

표면 셰이더 작성 - Unity 매뉴얼

빌트인 렌더 파이프라인에서 표면 셰이더는 조명과 상호작용하는 셰이더를 더욱 간단하게 작성하는 방법입니다.

docs.unity3d.com

 

라이트 모델을 바꿔보았다.
코드 수정

Shader "Custom/Red"
{
    Properties
    {
      _MyColor("MyColor", Color) = (1,1,1,1)
      
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
       

        CGPROGRAM
        #pragma surface surf _MyLightModel noambient noshadow
        #pragma target 3.0

        struct Input
        {
            float2 uv_MainTex;
        };

        fixed4 _MyColor;
      
        void surf (Input IN, inout SurfaceOutput o)
        {
           //o.Albedo = fixed3(_MyColor.r,_MyColor.g,_MyColor.b);
           // o.Albedo = _MyColor;//Albedo는 빛의 영향을 받는다
            //o.Emmision = _MyColor;//Emission은 빛의 영향 X but 물리엔진에 의한 빛O
            o.Emission = fixed3(_MyColor.r,_MyColor.g,_MyColor.b);
       }

        half4 Lighting_MyLightModel(SurfaceOutput s,half3 lightDir ,half atten){
            half ndotl = saturate(dot(s.Normal, lightDir));
            half4 final;
            final.rgb = s.Emission * ndotl;

         //   final.rgb = s.Albedo * ndotl;
            final.a = s.Alpha;
            return final;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
myoskin