Unity/그래픽스프로그래밍

0507_ 외곽선 만들어보기

minquu 2021. 5. 7. 14:29
반응형

이미지한장을 받는 스크립터를 먼저 만들고 시작한다.

 

기본 램버트를 받는 스크립터로

 

 

 

----

 

이번에는 CG를 두 번 렌더링 할 것이다.

 

이것을 Two Pass 라고한다.

 

기본적으로 밑에 이렇게 넣고 채우면 된다.

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

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


        //2pass
        CGPROGRAM
        #pragma surface surf Lambert
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

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

        ENDCG
    }
    FallBack "Diffuse"
}

---- 2pass 완성

 

 

위에랑 똑같이 채워 넣어주면 된다.

 

-----

 

1pass 에서 검정으로 채울 것이다.

 

렌더할때 뒷면은 안하게 되는데 명시적으로 적어 줄 수 있다. 

이것을 cull back 이라고 한다.

 

태그 밑에 넣어주면 된다

 

Cull Back //  Front // off 가 될 수도있다. // 프론트는 앞을 렌더 안함  오프는 둘다 안함

 

----

오브젝트 크기를 키울 수 도 있다.

쉐이더에서 버텍스를 조절 할 수 있다.

 

그 전까지는 우리는 픽셀을 가지고 놀았는데, 이번에느 버텍스를 가지고 해본다.

 

 

vertex:vert 와 

 

void vert(inout appdata_full v){
        
        }

 

를 추가해준다. 꼭 이름이 같아야한다.

 

appdata_full 에 들어가는 건

 

구조체가 들어간다.

 

float4 이기 때문에 (x,y,z,w) 의 값을 가진다. (vertex)

 

테스트할겸 

 

            v.vertex.xyz += v.vertex.xyz; 

 

 

커진걸 확인 할 수 있다. 

 

 

노멀 방향 만큼 더 해줄 수도 있다.

 

 

 

----

옵션중에는 noshadow라는 것도 있다 // 모든 그림자를 없애준다.

 

 

 

------

 

조금 늘어나게 해 줄 수 잇다.

 

 

            v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;

 

----

1pass에서는 라이트가 필요없으니깐 _NoLight 옵션을 달아주고 라이트 를 달아준다.

 

 

 

그리고 서프 함수 안에 지워준다.  

 

인풋은 비워두면 안되서 컬러를 받는다.

 

 

컬 프론트로 해준다.

 

이걸 해주는건 1pass는 검정색만 받는 걸로 하기 위해서임

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        Cull Front

        CGPROGRAM
        #pragma surface surf _NoLight vertex:vert noshadow noambient

        #pragma target 3.0

        sampler2D _MainTex;

        void vert(inout appdata_full v){
            v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;
        }

        struct Input
        {
          float4 color: COLOR;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {

        }

        float4 Lighting_NoLight(SurfaceOutput s, float3 linghtDir, float atten){
            return float4(0,0,0,1);
        }
        ENDCG
        //2pass
        CGPROGRAM
        #pragma surface surf Lambert
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

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

        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

 

-----

 

겉 선이 너무 두꺼우면  

 

    void vert(inout appdata_full v){
            v.vertex.xyz = v.vertex.xyz + v.normal.xyz * 0.01;
        }

 

숫자를 조절해주면 된다.

 

프로퍼티에서 조절값을 받아서 해보자

 

 

 

 

 

------

 

문제는 Cull Front 한게 2 Pass에서도 적용되서 

 

면이 뒤집어 져서 보인다. 그래서 2 Pass에서 Cull Back 해줘야한다.

 

2Pass 에서 CGPROGRAM 들어가기 전에 

 

CULL BACK 해준다.

 

 

-----

 

 

반응형