셰이더 문서 정리하기


Standard : 물리기반 셰이더, 단단한 표면 (석재, 유리 세라믹, 황동)

* 특징
에너지 보존 : 물체가 받는 것보다 더 많은 빛이 나오지 않음, smoothness가 1에 가까우면 확산이 적어져서 하이라이트가 강해지고 작아진다, 0에 가까우면 확산이 넓어진다.

* HDR : 0-1범위 밖의 색상을 나타냄.

-----------

기본조명 : 반사광, 직사광

SkyBox : 기본적으로 하늘이지만, 반사 프로브를 사용하면 근처를 뽑아낼 수 있다.

Global illumination(간접광) : 반사된 빛, 방출 물질의 빛, 환경의 빛을 추적

머테리얼 에디터 : 텍스쳐를 사용하지 않으면 비용이 들지 않는다. 텍스쳐에 Ctrl + 클릭으로 큰 미리보기와 색상과 알파를 볼 수 있음.

머테리얼 만들기 : 텍스쳐 재질에 따라 나무 철을 함께 표시할 수 있다. 텍스쳐에는 그림자 하이라이트를 포함하면 안된다.

----------
Standard vs Standard(Specular Setup)

Standard : Metallic이 있음, 비금속은 들어온 빛 색깔과 같은 색을 반사하고, 금속은 Albedo의 색을 반사한다.

Standard(Specular Setup) : Specular가 있음, 검정은 Albedo를, 색이 있으면 반사와 반사의 세기를 제어

----------

Standard 파라미터


* Rendering Mode 

Opaque : 기본값, 일반 단단한 오브젝트에 적합
Cutout : Albedo 알파가 Alpha Cutoff보다 크면 보이고, 작으면 안 보인다. 반투명이 없어 가장자리가 딱딱하다.
Fade : 페이드아웃 애니메이션, 유리는 적합하지 않음.
Transparent : Albedo 알파와 틴트가 반투명을 만듦. 반사와 하이라이트는 선명

* Albedo : 물체 고유의 색, 단일 색을 사용할 수 있지만, 텍스쳐가 일반적 알파로 투명도 적용. 텍스쳐를 넣으면 Tint Color

* Metallic : 1금속일수록 환경을 더 반영, 알베도 덜 보임, 0비금속일수록  알베도 잘 보임, 반사가 위에 보임. 텍스쳐를 넣으면 메탈릭 슬라이더가 사라짐. 금속성은 R채널, 부드러움은 A채널

* Specular (스펙큘러 모드일때) : 하이라이트가 큼. 메탈릭과 스펙큘러 중 선택해서 쓰면 됨. smothness가 작으면 흐릿하고 크면 선명해짐 
. 텍스쳐를 넣으면 색이 사라짐. RGB를 쓰고 알파채널은 안 씀. 검정은 스펙큘러가 없음

* Smoothness : Metallic, Specular 모두 적용. 0이면 거친 표면, 1이면 부드러운 표면, source는 텍스쳐가 있으면 메탈릭/스펙큘러 또는 알베도 알파로 적용할 수 있음 1일때 

* Normal Map : Bump Map(렌더링될 물체의 픽셀마다 표면 법선을 흔들어 높낮이가 있어 보이게 하는 컴퓨터 그래픽 기술)의 한 유형. 3D 다각형에서 노말의 방향이 딱딱하지 않게 법선을 보간하여 곡면을 나타내는 데에도 원래 범프맵이 쓰였음. 여기서 한 단계 더 나아가 노멀매핑은 법선에 굴곡을 더 줌. 일반적으로 푸른 색조를 뛰며, RGB가 방향벡터의 X,Y를 나타냄. 그래서 다각형 특성에는 영향을 주지 않고 조명을 계산하는 방식에만 영향을 줌. 텍스쳐 타입은 노말맵이어야 하고 이 푸른색을 벡터로 표현하려면 *2 + 1을 해야 함

* Height Map : 높이매핑(시차 매핑)이라고도 함. 노멀맵과 함께 사용. 노멀맵은 텍스쳐 표면에 걸쳐 조명을 수정하지만 시차매핑은 한단계 더 나아가 실제로 보이는 텍스쳐 영역을 이동시킴. 카메라를 향하면 확대되고 향하지 않을수록 감소. 회색조이며 0검정은 낮고 1흰색은 높음

* Occlusion : 텍스쳐의 0은 간접조명(반사광)이 없어 어두움, 1은 간접조명을 받아 밝음

* Emission : 발광 방출. 어두운 데에서도 빛이 남. 텍스쳐, 색상으로 색조와 방출 강도 조절.
Global illumination은 방출하는 빛이 다른 오브젝트 조명에 영향을 미침. Realtime 실시간 GI에 조명계산 추가, Baked 정적 GI 조명계산 추가, none 영향을 미치지 않음

* Secondary Map : 디테일 알베도는 벽돌위의 그림, 디테일 노말맵은긁힘 등을 타일링하여 작은 표면의 디테일을 나타내는 데 사용됨 

-------------

Particle/Standard Surface 표준 파티클 셰이더

* Blending Option
Rendering Mode : Additive 배경 + 현재색. 불이나 마법주문 같은 글로우효과
Subtractive 배경 - 현재색. 증기나 두꺼운 검은 연기같은 안개효과
Modulate  배경 * 현재색. 포털이나 광선

Color Mode (Standard Unlit에서) : 텍스쳐와 색깔의 혼합모드 Multiply, Additive, Subtractive, Overlay, Color, Difference

* Main Options
Flip-Book Frame Blending 체크시 프레임간 부드러운 연결
Two Sided 체크시 양면 렌더링
Soft Particles 체크시 불투명한 오브젝트에 가까우면 페이드
Camera Fading 체크시 카메라에 가까우면 페이드 Near에 완전투명, Far에 완전 불투명
Distortion 가짜굴절, 불 일렁이는 거 강도와 혼합


-----------

레거시 셰이더

인스펙터에서 셰이더를 바꿀 수 있음. 한 셰이더를 여러 머테리얼에 적용할 수 있지만 한 머테리얼은 여러 셰이더를 사용할 수 없다 

Regacy Shaders탭 아래로 갈수록 계산량 증가

Unlit 텍스쳐
VertexLit 정점 조명 계산, 픽셀기반 아님
Decal VertexLit과 거의 같음. 두번째 데칼 텍스쳐의 알파가 메인텍스쳐의 보이는 영역을 결정
Diffuse 텍스쳐 + 틴트칼라, Lambert 조명계산
Diffuse Detail 메인텍스쳐 위에 타일링되는 텍스쳐로 디테일 가능,기본은 회색이고 어두운 색상은 기본 텍스처를 어둡게하고 밝은 색상은 밝게함.
Bumped Diffuse. 노말맵 추가, Lambert 조명계산
Specular. 스펙큘러 추가, Blinn Phong 조명계산, 텍스쳐 A채널은 Specular Map이라고도 불리며 의 검은색은 정반사가 없고, 흰색은 정반사가 가능
Bumped Specular. 스펙큘러 + 노말맵, Lambert +  Blinn Phong 조명계산, 텍스쳐 A채널은 Specular Map이라고 불림
Parallax Diffuse. 노말맵 + 높이맵
Parallax Specular. 노말맵 + 높이맵 + 스펙큘러
모바일도 비슷함


--------------

셰이더 종류

서피스 셰이더 : 조명연산하니까 무거움. 예시
https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
https://docs.unity3d.com/Manual/SL-SurfaceShaderLightingExamples.html
버택스 프래그먼트 셰이더 : 가벼움

-----------

셰이더랩 : 모든 셰이더는 이런 형식을 따름

Shader "MyShader" {
    Properties {
        _MyTexture ("My Texture", 2D) = "white" { }
        // 인스펙터에 보이는 프로퍼티들
    }
    SubShader {
        서피스나 버택스 프래그먼트 셰이더 작성
    }
    SubShader {
        // 위에서 지원하지 않으면 작동
    }
}

-----------

서피스 셰이더 : HLSL코드로 입력을 채움 

* 서피스 출력 구조체 
struct SurfaceOutput
{
    fixed3 Albedo;  // 고유색
    fixed3 Normal;  // 탄젠트 공간 노말
    fixed3 Emission;
    half Specular;  // 정반사
    fixed Gloss;    // 스펙큘러 강도
    fixed Alpha;    // 투명도를 위한 알파
};


물리적 계산을 할 경우
struct SurfaceOutputStandard
{
    fixed3 Albedo;     
    fixed3 Normal;     
    half3 Emission;
    half Metallic;      // 0=비금속, 1=금속
    half Smoothness;    // 0=거침, 1=부드러움
    half Occlusion;     // 환경차폐 (기본 1), 0=어두움, 1=밝음
    fixed Alpha;       
};

struct SurfaceOutputStandardSpecular
{
    fixed3 Albedo;      
    fixed3 Specular;    
    fixed3 Normal;    
    half3 Emission;
    half Smoothness;    /// 0=거침, 1=부드러움
    half Occlusion;     // 환경차폐 (기본 1), 0=어두움, 1=밝음
    fixed Alpha;       
};


* 컴파일 지시문
CGPROGRAM..ENDCG는 Pass안에 쓰면 안됨
#pragma surface surf lightModel [optionalparams]

void surf (Input IN, inout SurfaceOutput o)  { } //함수를 정의
lightModel : Standard, StandardSpecular, Lambert, BlinnPhong이 있다.


* lightModel 조명모델
Standard조명 모델은 SurfaceOutputStandard출력 구조체를 사용 하며 Unity의 표준 (메탈릭) 셰이더와 일치.
StandardSpecular조명 모델은 SurfaceOutputStandardSpecular출력 구조체를 사용 하고 Unity의 표준 (스펙큘러) 셰이더와 일치.
Lambert및 BlinnPhong조명 모델은 물리적으로 기초하지 않지만 로우 엔드 하드웨어 렌더링을 빠르게 할 수 있습니다.


* optionalparams 선택적 매개변수
alpha (https://docs.unity3d.com/Manual/SL-SurfaceShaders.html) ★

vertex:vert 생성이 시작 될 때 버텍스 셰이더 함수
void myvert (inout appdata_full v, out Input IN)
      {
          float4 hpos = UnityObjectToClipPos(v.vertex);
      }

finalcolor:ColorFunction 최종 색상 프래그먼트 셰이더 함수
void mycolor (Input IN, SurfaceOutput o, inout fixed4 color)
      {
          color *= _ColorTint;
      }

finalgbuffer:ColorFunction -GBuffer(화면에 보이는 Geometry 기록) 변경 경로
finalprepass:ColorFunction -사용자 정의 프리 패스 기본 경로.


* Shadow와 Tessellation
addshadow
fullforwardshadows
tessellate:TessFunction ★


* 코드 생성 옵션
exclude_path:deferred, exclude_path:forward, exclude_path:prepass 지정된 경로로 패스를 생성하지 않음 디퍼드, 포워드, 레거시 디퍼드 (카메라에 렌더링패스)
noshadow 이 셰이더에서 모든 그림자를 받지 않음.
noambient 환경광과 라이트 프로브 없음.
novertexlights 포워드 렌더링에서 라이트 프로브 또는 버텍스 당 라이트 없음.
nolightmap 이 셰이더에서 모든 라이트 매핑 없음.
nodynlightmap 런타임 GI 없음.
nodirlightmap 이 셰이더에서 다이렉트 라이트 맵 없음.
nofog 안개 없음.
nometa - "메타"패스를 생성하지 않습니다 (라이트 맵핑 및 동적 전역 조명에서 표면 정보를 추출하는 데 사용됨).
noforwardadd- 포워드 렌더링 추가 패스를 비활성화합니다 . 따라서 셰이더는 버텍스 / SH마다 계산 된 다른 모든 라이트와 함께 하나의 전체 방향 라이트를 지원합니다. 셰이더도 더 작게 만듭니다.
nolppv - 라이트 프로브 프록시 볼륨없음.
noshadowmask 그림자마스크 없음.


* 기타 옵션 
softvegetation -부드러운 식물이 켜져있을 때만 표면 쉐이더를 렌더링합니다.
interpolateview 버텍스 셰이더에서 뷰 방향을 계산하고 보간합니다. 픽셀 쉐이더를 더 빠르게 만들 수 있음.
halfasview 뷰 방향 대신 반 방향 벡터를 조명 기능으로 전달하십시오. 정점마다 절반 방향이 계산되고 정규화됩니다. 이것은 빠르지만 완전히 정확하지는 않습니다.
dualforward- 포워드 렌더링에 이중 라이트 맵을 사용하십시오 .
dithercrossfade-표면 쉐이더가 디더링 효과를 지원합니다. 그런 다음이 셰이더를게임 오브젝트
 사용하는 LOD 그룹
 크로스 페이드 전환 모드로 구성된 컴포넌트.


struct Input 
{
    float3 viewDir; // 뷰 방향
    float4 color : COLOR; // 정점 색상 보간
    float4 screenPos // 화면 공간 위치, GrabPass에는 비적합
    float4 ComputeGrabScreenPos(float4 clipPos); // 커스텀 UV생성
    float3 worldPos; // 월드 공간 위치
    float3 worldRefl; // 서피스 쉐이더가 o.Normal을 쓰지 않으면 월드 반사 벡터를포함
    float3 worldNormal; // 서피스 쉐이더가 o.Normal을 쓰지 않으면 월드 법선 벡터를 포함
    float3 worldRefl; INTERNAL_DATA 서피스 쉐이더가 o.Normal을 쓰면 월드 반사 벡터를 포함. 픽셀당 반사벡터는 WorldReflectionVector(IN, o.Normal); 
    float3 worldNormal; INTERNAL_DATA  // 서피스 쉐이더가 o.Normal을 쓰면 월드 법선 벡터를 포함. 픽셀당 노말벡터는 WorldNormalVector (IN, o.Normal)
}


-------

서피스 셰이더 예시 https://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html

-------

커스텀 조명모델 : Lambert, BlinnPhong은 내장되어 있음 

half4 LightingSimpleLambert (SurfaceOutput s, half3 lightDir, half atten) 
{
              half NdotL = dot (s.Normal, lightDir);
              half4 c;
              c.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
              c.a = s.Alpha;
              return c;
}

---------

렌더링 파이프라인
InputAssembler -> VertexShader -> HullShader-> Tessellator -> DomainShader -> GeometryShader -> Rasterizer -> PixelShader -> OutputMerger

래스터라이저는 보간

---------

버텍스 프래그먼트 셰이더 


// 기본형
Shader "Unlit/SingleColor"
{
    Properties
    {
        _Color ("Main Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            float4 vert (float4 vertex : POSITION) : SV_POSITION //Rasterizer 에서 SV_Position 시멘틱의 값을 기준으로 보간을 해주기 위함
            {
                return UnityObjectToClipPos(vertex);
            }
            
            fixed4 _Color;

            fixed4 frag () : SV_Target // OutputMerger 에서 렌더타겟에 어떤 컬러를 그릴지 결정
            {
                return _Color; 
            }
            ENDCG
        }
    }
}




// 노말 표현
Shader "Unlit/WorldSpaceNormals"
{
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // UnityObjectToWorldNormal 사용 가능
            #include "UnityCG.cginc" 

            struct v2f {
                half3 worldNormal : TEXCOORD0;
                float4 pos : SV_POSITION;
            };


            v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(vertex);
                o.worldNormal = UnityObjectToWorldNormal(normal);
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(i.worldNormal * 0.5 + 0.5 , 1);
            }
            ENDCG
        }
    }
}


버텍스 프래그먼트 예제 https://docs.unity3d.com/Manual/SL-VertexFragmentShaderExamples.html

Shader "Unlit/SingleColor"
{
    Properties
    {
        _MainTex ("Sprite Texture", 2D) = "white" {}
    }

    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col; 
            }
            ENDCG
        }
    }
}

-------------

#include "UnityCG.cginc"

HLSLSupport.cginc (자동포함) 크로스 플랫폼에 대한 헬퍼 매크로 및 정의셰이더, CGPROGRAM를 쓸 때 포함됨
UnityShaderVariables.cginc (자동포함) 일반적으로 사용되는 전역 변수, CGPROGRAM를 쓸 때 포함됨
UnityCG.cginc 일반적으로 사용되는 도우미 기능, C:\Users\0427h\Documents\2019.3.0f3\Editor\Data\CGIncludes\UnityCG.cginc에서 볼 수 있음
AutoLight.cginc -조명 및 그림자 기능 표면 쉐이더
Lighting.cginc-표준 표면 쉐이더 조명 모델; 서피스 쉐이더를 작성할 때 자동 포함.
TerrainEngine.cginc -터레인 & 식물 쉐이더.


* UnityCG.cginc에 포함된 구조체

struct appdata_img
{
    float4 vertex : POSITION;
    half2 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct v2f_img
{
    float4 pos : SV_POSITION;
    half2 uv : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
    UNITY_VERTEX_OUTPUT_STEREO
};

struct appdata_base {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_tan {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    float4 texcoord2 : TEXCOORD2;
    float4 texcoord3 : TEXCOORD3;
    fixed4 color : COLOR;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

*상수 그룹화 : 애플리케이션에서 보내는 데이터
CBUFFER_START(myValue)
fixed4 _Color;
CBUFFER_END



-------------

UnityCG.cginc 빌트인 함수


정점 변환 함수
float4 UnityObjectToClipPos(float3 pos) 버텍스 오브젝트에서 클립공간변환 mul (UNITY_MATRIX_MVP, float4 (pos, 1.0))을 대체
float3 UnityObjectToViewPos(float3 pos) 버텍스 오브젝트에서 클립공간변환 mul (UNITY_MATRIX_MV, float4 (pos, 1.0)). xyz을 대체

일반 도우미 함수 : 버텍스 뿐 아니라 어디든 쓸 수 있음
float3 WorldSpaceViewDir (float4 v) 월드 공간에 있는 것을 뷰 방향으로 변환
float3 ObjSpaceViewDir (float4 v)로컬 공간에 있는 것을 뷰 방향으로 변환
float2 ParallaxOffset (half h, half height, half3 viewDir) 시차 노멀 매핑에 대한 UV 오프셋을 계산합니다.
float2 ParallaxOffset( half h, half height, half3 viewDir )
            {
                h = h * height - height/2.0;
                float3 v = normalize(viewDir);
                v.z += 0.42;
                return h * (v.xy / v.z);
            }
fixed Luminance (fixed3 c) 컬러를 휘도(그레이스케일)로 변환.
fixed3 DecodeLightmap (fixed4 color) Unity 라이트맵에서 컬러를 디코딩합니다
 (플랫폼에 따라 RGBM 또는 dLDR).
float4 EncodeFloatRGBA (float v) 정밀도가 낮은 렌더 타겟에 저장하기 위해 [0..1) 범위를 RGBA 색상으로 인코딩합니다.
float DecodeFloatRGBA (float4 enc) RGBA 색상을 부동으로 디코딩합니다.
float2 EncodeFloatRG (float v) [0..1) 범위를 float2로 인코딩합니다.
float DecodeFloatRG (float2 enc) 이전에 인코딩 된 RG 플로트를 디코딩합니다.
float2 EncodeViewNormalStereo (float3 n) 뷰 공간 법선을 0..1 범위의 두 숫자로 인코딩합니다.
float3 DecodeViewNormalStereo (float4 enc4) enc4.xy에서 일반보기 공간을 디코딩합니다.

포워드 함수
float3 WorldSpaceLightDir (float4 v) 오브젝트 공간 정점 위치가 주어지면 월드 공간 방향 (정규화되지 않음)을 빛으로 계산합니다.
float3 ObjSpaceLightDir (float4 v) 오브젝트 공간 정점 위치가 주어진 경우 오브젝트 공간 방향 (정규화되지 않음)을 빛으로 계산합니다.
float3 Shade4PointLights (...) 벡터에 밀집된 라이트 데이터로 4 개의 포인트 라이트에서 조명을 계산합니다. 앞으로표현
 이것을 사용하여 버텍스 당 조명을 계산합니다.

화면 공간 함수
float4 ComputeScreenPos (float4 clipPos) 스크린 스페이스 매핑 된 텍스처 샘플을 수행하기위한 텍스처 좌표를 계산합니다. 입력은 클립 공간 위치입니다.
float4 ComputeGrabScreenPos (float4 clipPos) GrabPass 텍스쳐를 샘플링하기위한 텍스처 좌표를 계산합니다 . 입력은 클립 공간 위치입니다.

버텍스 라이트 함수
float3 ShadeVertexLights (float4 vertex, float3 normal) 객체 공간 위치 및 법선이 주어지면 4 개의 버텍스 당 조명 및 주변 조명으로부터 조명을 계산합니다.


-----------

UnityCG.cginc 빌트인 변수

변환
UNITY_MATRIX_MVP 현재 모델 * 뷰 * 프로젝션 매트릭스.
UNITY_MATRIX_MV 현재 모델 * 뷰 매트릭스.
UNITY_MATRIX_V 현재 뷰 매트릭스.
UNITY_MATRIX_P 현재 투영 행렬.
UNITY_MATRIX_VP 현재보기 * 투영 행렬.
UNITY_MATRIX_T_MV 모델 * 뷰 매트릭스의 전치.
UNITY_MATRIX_IT_MV 모델 * 뷰 행렬의 역전 치.
unity_ObjectToWorld 현재 모델 매트릭스.
unity_WorldToObject 현재 세계 행렬의 역수.

카메라와 스크린
_WorldSpaceCameraPos float3 카메라의 월드 공간 위치.
_ProjectionParams float4 x는 1.0 (또는 현재 투영 된 투영 행렬로 렌더링하는 경우 –1.0 )이며 y카메라의 가까운 평면이고 z카메라의 먼 평면이며 w1 / FarPlane입니다.
_ScreenParams float4 x 카메라 대상 텍스처의 너비입니다. 픽셀
, y픽셀 카메라의 대상 조직의 높이 z1.0 + 1.0 / 폭 w1.0 + 1.0 / 높이이다.
_ZBufferParams float4 Z 버퍼 값을 선형화하는 데 사용됩니다. xis (1-far / near), yis (far / near), zis (x / far) 및 wis (y / far)입니다.
unity_OrthoParams float4 x직교 카메라의 너비, y직교 카메라의 높이, z사용되지 않으며 w카메라가 직교 인 경우 1.0, 원근법 인 경우 0.0입니다.
unity_CameraProjection float4x4 카메라의 프로젝션 매트릭스.
unity_CameraInvProjection float4x4 카메라의 프로젝션 매트릭스의 역수.
unity_CameraWorldClipPlanes [6] float4 카메라 절두체 평면 세계 공간 방정식 (왼쪽, 오른쪽, 아래쪽, 위쪽, 근처, 먼 순서).

시간
_Time float4 레벨로드 이후 시간 (t / 20, t, t * 2, t * 3)은 셰이더 내부의 사물을 애니메이션하는 데 사용됩니다.
_SinTime float4 사인 시간 : (t / 8, t / 4, t / 2, t).
_CosTime float4 시간의 코사인 : (t / 8, t / 4, t / 2, t).
unity_DeltaTime float4 델타 시간 : (dt, 1 / dt, smoothDt, 1 / smoothDt).

조명(포워드)
_LightColor0 ( UnityLightingCommon.cginc 에서 선언) fixed4 밝은 색.
_WorldSpaceLightPos0 float4 방향 조명 : (세계 공간 방향, 0). 다른 조명 : (세계 공간 위치, 1).
unity_WorldToLight ( AutoLight.cginc 에서 선언) float4x4 월드 투 라이트 매트릭스. 쿠키 및 감쇠 텍스처를 샘플링하는 데 사용됩니다.
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0 float4 중요하지 않은 첫 번째 포인트 라이트의 월드 공간 위치 (ForwardBase 패스 만 해당)
unity_4LightAtten0 float4 처음 4 개의 중요하지 않은 포인트 라이트의 감쇠 계수 (ForwardBase 패스에만 해당) .

조명(디퍼드)
_LightColor float4 밝은 색.
unity_WorldToLight float4x4 월드 투 라이트 매트릭스. 쿠키 및 감쇠 텍스처를 샘플링하는 데 사용됩니다.
unity_WorldToShadow float4x4 [4] 월드-섀도우 매트릭스. 스폿 조명용 매트릭스 1 개, 방향성 조명 캐스케이드 용 최대 4 개.

unity_LightColor half4 [8] 밝은 색상.
unity_LightPosition float4 [8] 시야 공간 조명 위치. 방향성 조명에 대한 (-방향, 0); 점 / 점 조명의 경우 (위치, 1)
unity_LightAtten half4 [8] 광 감쇠 계수. x 는 cos (spotAngle / 2) 또는 비점 등의 경우 –1입니다. y 는 1 / cos (spotAngle / 4) 또는 비점 등의 경우 1입니다. z 는 2 차 감쇠이고; w 는 제곱 된 광 범위입니다.
unity_SpotDirection float4 [8] 시야 공간 스폿 라이트 위치; 비점 등의 경우 (0,0,1,0).

라이트맵
unity_Lightmap Texture2D 포함 라이트 맵
 정보.
unity_LightmapST float4 [8] 라이트 맵 텍스처를 샘플링하기 위해 UV 정보의 스케일을 조정하고 올바른 범위로 변환합니다.

안개와 환경
unity_AmbientSky fixed4 그라데이션 주변 조명 케이스의 하늘 주변 조명 색상.
unity_AmbientEquator fixed 4 그라디언트 주변 조명 케이스의 적도 주변 조명 색상.
unity_AmbientGround fixed4 그라디언트 앰비언트 조명 케이스의 그라운드 앰비언트 조명 색상.
UNITY_LIGHTMODEL_AMBIENT fixed4 앰비언트 조명 색상 (그라데이션 앰비언트 경우 하늘 색상). 레거시 변수.
unity_FogColor fixed4 안개 색.
unity_FogParams float4 안개 계산을위한 매개 변수 : (밀도 / sqrt (ln (2)), 밀도 / ln (2), –1 / (끝 시작), 끝 / (끝 시작)). x 는 Exp2 포그 모드, y 는 Exp 모드, z 및 w 는 선형 모드에 유용 합니다.

기타
unity_LODFade float4 LODGroup 사용시 세부 레벨 페이드 . x 는 페이드 (0..1)이고, y 는 16 레벨로 페이드 양자화되며, z 및 w는 사용되지 않습니다.
_TextureSampleAdd float4 Unity 에서 자동으로 설정UI
사용되는 텍스처가 Alpha8 형식인지 (값이 (1,1,1,0)로 설정되어 있는지) 아닌지 (값이 (0,0,0,0)으로 설정되어 있는지) 에만 기반합니다.


-------------

데이터 형식

float 32비트
half 16비트
fixed 12비트
int 8비트

--------------

ShaderLab 변수


Shader "Unlit/SingleColor"
{
    Properties
    {
        _MyRange ("MyRange", Range (0, 1)) = 0
        _MyFloat ("MyFloat", Float) = 0
        _MyInt ("MyInt", Int) = 0
        _MyColor ("MyColor", Color) = (0,0,0,0)
        _MyVector ("MyVector", Vector) = (0,0,0,0)
        _My2D ("My2D", 2D) = "2DTexture" {}
        _MyCube ("MyCube", Cube) = "CubeTexture" {}
        _My3D ("My3D", 3D) = "3DTexture" {}
    }

    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            float4 vert (float4 vertex : POSITION) : SV_POSITION 
            {
                return UnityObjectToClipPos(vertex);
            }

            float _MyRange;
            float _MyFloat;
            int _MyInt;
            float4 _MyColor;
            float4 _MyVector;
            sampler2D _My2D;
            samplerCUBE _MyCube;
            sampler3D _My3D;

            fixed4 frag () : SV_Target
            {
                return fixed4(1,0,0,1); 
            }
            ENDCG
        }
    }
}

float는 13.37
2D텍스쳐는 "white"(RGBA : 1,1,1,1), "black"(RGBA : 0,0,0, 0), "grey"(RGBA : 0.5,0.5,0.5,0.5), "범프"(RGBA : 0.5,0.5,1,0.5) 또는 "red"(RGBA : 1,0,0,0)
2D가 아닌 텍스쳐는 회색 (RGBA : 0.5,0.5,0.5,0.5)이 사용됨

--------

애트리뷰트
[HideInInspector] 인스펙터에서 변수 숨김
[NoScaleOffset] 텍스쳐에 붙혀 타일링/오프셋 숨김
[Normal] 텍스쳐에 붙혀 노멀맵을 넣어야 함을 알려줌
[HDR] 색깔에 붙혀 HDR을 나타냄
[Gamma] float/Vector/Color를 sRGB(색깔이 33%만 보임)로 지정
[PerRendererData] 텍스쳐가 이 머티리얼 프로퍼티 블록 형식으로 렌더링 데이터 당에서 올 것임을 나타냅니다 ★
[MainTexture] 기본적으로 _MainTex라고 쓰면 기본 텍스쳐이지만 이 애트리뷰트를 붙히면 이게 기본 텍스쳐
[MainColor] 기본적으로 _Color가 기본 색상이지만 이 애트리뷰트를 붙히면 이게 기본 색상

--------

SubShader {
    Pass {
        Lighting Off
        SetTexture [_MainTex] {}
    }
}


Pass { [이름과 태그] [렌더설정] }

* 렌더설정 : Pass 최상단에 CGPROGRAM바깥에

Cull (Back | Front | Off) 컬링은 버텍스 셰이더 이후 눈에 보이지 않는 부분 버리는 것
Back : 기본값, 노멀 방향의 반대 다각형을 버림
Front : 노멀 방향의 다각형을 버림
Off : 모든 면이 그려짐, 2Side

ZWrite (On | Off) 깊이버퍼 쓰기모드
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
blend SrcAlpha OneMinusSrcAlpha //이렇게 써야 투명해짐
On : 기본값, 복잡한 물체 투명할 때 깊이에 있어 가려진 부분을 없앰
Off : 깊이에 있어 가려진 부분도 보임, 뒤에 물체가 있으면 보임

ZTest (Less | Greater | LEqual | GEqual | Equal | NotEqual | Always) 깊이버퍼 테스트모드, 가려져 있는지 확인
Greater : 다른 물체 뒤에 가려져서 보임, 패스를 2번 돌려 첫번째는 기본색, 2번째는 가려진 색 대입
Always : 항상 모든 물체보다 앞에보임

Offset OffsetFactor, OffsetUnits Z버퍼 깊이 오프셋 설정 ★

Blend Off : 기본값, 현재색상과 배경색상 혼합없음
Blend SrcFactor DstFactor : 생성된 색 * SrcFactor + 배경색 * DstFactor
Blend SrcFactor DstFactor, alphaSrcFactor alphaDstFactor : 알파채널도 혼합
One Blend factor(1,1,1,1)
Zero Blend factor(0,0,0,0)
SrcColor Blend factor(Rs,Gs,Bs,As) 소스 컬러값
SRCALPHA Blend factor(As,As,As,As) 소스 알파 값
DstColor Blend factor(Rd,Gd,Bd,Ad)프레임 버퍼 소스 컬러 값
DstAlpha Blend factor(Ad,Ad,Ad,Ad)프레임 버퍼 소스 알파 값
OneMinusSrcColor 1 - SrcColor 이 단계의 값이 곱해진다.
OneMinusSrcAlpha 1 - SrcAlpha 이 단계의 값이 곱해진다.
OneMinusDstColor 1 - DstColor 이 단계의 값이 곱해진다.
OneMinusDstAlpha 1 - DstAlpha 이 단계의 값이 곱해진다.
Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency
Blend One OneMinusSrcAlpha // Premultiplied transparency
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative


AlphaToMask (On | Off) 알파 블렌딩, 알파 작동 및 알파-커버리지 모드를 설정

ColorMask (RGB | A | 0 | any) combination of R, G, B, A 컬러 채널 마스크 설정, ColorMask 0을 쓰면 모든 색상 채널에 대한 렌더링이 꺼져 색이 안나옴. ColorMask RGB 3렌더링 대상 # 3을 RGB 채널에만 쓰도록 만듭니다


* 조명모드 태그 "LightMode"=" "

Always  - 언제나 렌더링.  조명이 적용되지 않습니다.
Forwardbase - 포워드 베이스 렌더링. ambient, main directional light, vertex/SH lights and lightmap  등이 적용됩니다.
ForwardAdd - 포워드 베이스 렌더링. additive per-pixel lights 가 하나의 패스당 적용 됩니다.
Deferred - 디퍼드 렌더링. G-Buffer 를 사용 합니다.
ShadowCaster -  shadowmap 또는 depth texture 로 개체의 깊이를 랜더링 합니다.
PrepassBase - 레거시 디퍼드 라이팅 에서 사용되는 노멀, 스페큘러 를 렌더링 합니다.
PrepassFinal - 레거시 디퍼드 라이팅에서 사용되는 최종 컬러(텍스쳐 가 합산된), 조명  그리고 Emission을 랜더링 합니다.
Vertex - 레거시 버택스 라이트 렌더링.  라이트맵이 적용 되지 않은상태에서의 정점 조명이 적용됩니다.
VertexLMRGBM - 라이트맵을 사용하는 RGBM 인코딩 포멧(PC및 모바일)에서 사용됩니다.
VertexLM - 라이트맵을 사용하는 LDR (모바일) 플랫폼용 코드 입니다.  

* Stencil 스텐실 : 버퍼 값 비교

Stencil 
{
    Ref 1 // 비교할 번호
    Comp always // 비교구문 (Greater | GEqual | Less | LEqual | Equal | NotEqual | Always | Never)
    Pass replace // 비교 성공시 (Keep 유지 | Zero 0대입| Replace 버퍼에 값을 씀| IncrSat 버퍼현재값 증가255는 유지| DecrSat 버퍼 현재값 감소 0은 유지| Invert 비트 무효화| IncrWrap 버퍼현재값 증가255는 0 | DecrWrap 버퍼 현재값 감소 0은 255) 버퍼의 현재 번호
    Fail 옵션 // 비교 실패시
    ZFail 옵션 // 비교는 성공했지만 깊이테스트는 실패
}


Shader "Red" {
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry"}
        Pass {
            Stencil {
                Ref 2
                Comp always
                Pass replace
            }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(1,0,0,1);
            }
            ENDCG
        }
    } 
}
빨강을 통과한 스텐실 버퍼 픽셀만 초록에 전달됨, 겹쳐서 실패하면 1감소

Shader "Green" {
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+1"}
        Pass {
            Stencil {
                Ref 2
                Comp equal
                Pass keep 
                ZFail decrWrap
            }
        
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(0,1,0,1);
            }
            ENDCG
        }
    } 
}

초록을 통과하면 1과 같은 것만 파랑이 나옴

Shader "Blue" {
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry+2"}
        Pass {
            Stencil {
                Ref 1
                Comp equal
            }
        
            CGPROGRAM
            #include "UnityCG.cginc"
            #pragma vertex vert
            #pragma fragment frag
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(0,0,1,1);
            }
            ENDCG
        }
    }
}


-------------

GrabPass 그랩패스


Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _BackgroundTexture
        GrabPass
        {
            "_BackgroundTexture"
        }

        // Render the object with the texture generated above, and invert the colors
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert(appdata_base v) {
                v2f o;
                // use UnityObjectToClipPos from UnityCG.cginc to calculate 
                // the clip-space of the vertex
                o.pos = UnityObjectToClipPos(v.vertex);
                // use ComputeGrabScreenPos function from UnityCG.cginc
                // to get the correct texture coordinate
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }

            sampler2D _BackgroundTexture;

            half4 frag(v2f i) : SV_Target
            {
                half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
                return 1 - bgcolor;
            }
            ENDCG
        }

    }
}


----------

태그

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }

* Queue 태그 : 그려지는 순서 결정, 낮은 순서가 먼저 그려짐 "Queue" = "Geometry+1"숫자로 더할 수 있음
Background 백그라운드에서 실행 (1000)
Geometry 기본값, 불투명한 오브젝트 (2000)
AlphaTest 불투명 이후 알파테스트 (2450)
Transparent 투명, 깊이에 쓰지 않은 것은 여기에 (3000)
Overlay 렌즈플레어같은 오버레이 (4000)

* RenderType 태그 : 셰이더 종류 분류, 카메라 깊이 텍스쳐에 사용될 수 있음
Opaque 대부분 쉐이더 Normal, Self Illuminated, Reflective, terrian
Transparent 대부분의 반투명 쉐이더 Transparent, Particle, Font, terrian additive pass
TransparentCutout 마스트된 투명 쉐이더 Transparent Cutout, two pass vegetation
Background 스카이 박스
Overlay GUI Texture, Halo, Flare
TreeOpaque 지형엔진의 나무 껍징
TreeTransparentCutout 지형엔진의 나무 잎
TreeBillboard 지형 엔진의 빌보드 나무
Grass 지형 엔진의 풀잎
GrassBillboard 지형엔진의 풀잎 빌보드

----------------

Fallback "name" 이 기기에서 셰이더를 실행할 수 없는 경우 기본을 실행
Fallback Off

-------------

커스텀 에디터 

Shader "Custom/Redify" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        #pragma surface surf Lambert addshadow
        #pragma shader_feature REDIFY_ON

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            half4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;

            #if REDIFY_ON
            o.Albedo.gb *= 0.5;
            #endif
        }
        ENDCG
    } 
    CustomEditor "CustomShaderGUI"
}



using UnityEngine;
using UnityEditor;
using System;

public class CustomShaderGUI : ShaderGUI
{
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
    {
        base.OnGUI(materialEditor, properties);

        Material targetMat = materialEditor.target as Material;

        bool redify = Array.IndexOf(targetMat.shaderKeywords, "REDIFY_ON") != -1;
        EditorGUI.BeginChangeCheck();
        redify = EditorGUILayout.Toggle("Redify material", redify);
        if (EditorGUI.EndChangeCheck())
        {
            if (redify)
                targetMat.EnableKeyword("REDIFY_ON");
            else
                targetMat.DisableKeyword("REDIFY_ON");
        }
    }
}



---------------


Shader "Unlit/Shild"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
    }
        SubShader
    {
        Tags { "RenderType" = "Transparent" }
        LOD 100

        Pass
        {
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float3 normal : NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
                float3 viewDir : VIEW_DIR;
                float3 normal : NORMAL;
                float4 screenPos : TEXCOORD1; // 스크린 위치에 대한 스크린 위치 값
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            sampler2D_float _CameraDepthTexture;   // 카메라로부터 뎁스텍스처를 받아옴

            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);

                o.screenPos = ComputeScreenPos(o.vertex); // 스크린 위치에 대한 스크린 위치 값 구하기

                o.viewDir = WorldSpaceViewDir(v.vertex);
                o.normal = mul(unity_ObjectToWorld, v.normal);

                return o;
            }

            float fresnelEffect(float3 normal, float3 viewDir, float power)
            {
                return pow((1.0 - saturate(dot(normalize(normal), normalize(viewDir)))), power);
            }

            fixed4 frag(v2f i) : SV_Target
            {
                //fixed4 col = tex2D(_MainTex, i.uv);


                float fDepthData = tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.screenPos)).r;   // 텝스텍스처 샘플러에서 텍셀정보를 가져옴
                float fSceneZ = LinearEyeDepth(fDepthData);

                float depth = i.screenPos.w;
                float diff = distance(fSceneZ, depth);

                float diffs = smoothstep(0, 0.1, diff);
                diffs = pow(diffs, 5);

                float fresnel = smoothstep(0, 0.3, fresnelEffect(i.normal, i.viewDir, 5));

                return fixed4(float3(1,1,1), fresnel + (1 - diffs));
            }
            ENDCG
        }
    }
}