ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [유니티 쉐이더 스타트업] 쉐이더 코드를 깔끔하게 정리하는법
    프로그래밍/Unity Shader 2019. 5. 19. 14:18

    https://zerodeg.tistory.com/39

     

    [Unity Shader] 색상을 입력 받아 출력해보기 - 2

    https://zerodeg.tistory.com/36?category=812191 [Unity Shader] 색상을 입력받아 출력해보기 https://zerodeg.tistory.com/35 [Unity Shader] 쉐이더에서 변수는 어떻게 이용할까? https://zerodeg.tistory.com/..

    zerodeg.tistory.com

    안녕하세요. 저번 시간까지 쉐이더에서 만든 인터페이스를 통해서 유니티에서 어떻게 오브젝트의 색을 변경하는지에 대해 알아보았는데요. 아직 보지 않았는데 궁금하신 분이 계시다면 위 링크를 통해서 확인하고 오시면 분명 도움이 될거라고 생각합니다. 아무튼, 오늘은 쉐이더 코드를 깔끔하게 정리하는 방법에 대해서 알아보는 시간을 가져보려고 합니다. 저는 현재 유니티 쉐이더 스타트업이라는 책을 통해서 공부를 하고 있는데요. 혹시 책을 보고 계신 분이 계시다면 제가 지금 보고 있는 페이지는 124페이지니까 같이 보면서 하면 더 집중이 되지 않을까 생각해봅니다.

    먼저 인터페이스에서 지워도 상관 없는 프로퍼티와 그와 연관이 있는 변수부터 지워보도록 하겠습니다. 지워야 하는 부분을 모두 알려드린 다음에 다시 설명을 해보겠습니다.

     

    Shader "Custom/NewSurfaceShader"
    {
    	//1
        Properties
        {
    
            _Color ("Color", Color) = (1,1,1,1) // 삭제!
            _MainTex ("Albedo (RGB)", 2D) = "white" {} // 삭제!
    		_Glossiness("Smoothness", Range(0,1)) = 0.5 // 삭제!
    		_Metallic("Metallic", Range(0,1)) = 0.0 // 삭제!
    
    		_Red("Red", Range(0, 1)) = 0.0
    		_Green("Green", Range(0, 1)) = 0.0
    		_Blue("Blue", Range(0, 1)) = 0.0
    		_Brightness("Brightness", Range(-1, 1)) = 0.0
    
        }
    	//2
        SubShader
        {
            Tags { "RenderType"="Opaque" }
            LOD 200
    
    		//3
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            #pragma surface surf Standard fullforwardshadows
    
            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma target 3.0
    
            sampler2D _MainTex; // 삭제!
    
            struct Input
            {
                float2 uv_MainTex; // 삭제!
            };
    
            half _Glossiness; // 삭제!
            half _Metallic; // 삭제!
            fixed4 _Color; // 삭제!
    
    		float _Red;
    		float _Green;
    		float _Blue;
    		float _Brightness;
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
    			
    			// Albedo comes from a texture tinted by color
    			fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; // 삭제!
    			o.Albedo = float3(_Red, _Green, _Blue) + _Brightness;
    
                //Metallic and smoothness come from slider variables
                o.Metallic = _Metallic; // 삭제!
                o.Smoothness = _Glossiness; // 삭제!
    			o.Alpha = c.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    

     

    주석에서 삭제! 라고 적혀 있는 부분은 모두 삭제를 해주시면 되는데요. Properties에서 설정한 변수는 CGPROGRAM ~ ENDCG에서도 반드시 지워주셔야 합니다. 여기서 지우기가 조심스러운 부분이 있는데, 바로 MainTex와 관련되어 있는 부분입니다. 먼저 위에서 주석처리한 부분을 실제로 지운 다음에 실행을 시켜보고 다시 이야기해보겠습니다.

    Shader "Custom/NewSurfaceShader"
    {
    	//1
        Properties
        {
    
    		_Red("Red", Range(0, 1)) = 0.0
    		_Green("Green", Range(0, 1)) = 0.0
    		_Blue("Blue", Range(0, 1)) = 0.0
    		_Brightness("Brightness", Range(-1, 1)) = 0.0
    
        }
    	//2
        SubShader
        {
            Tags { "RenderType"="Opaque" }
            LOD 200
    
    		//3
            CGPROGRAM
            // Physically based Standard lighting model, and enable shadows on all light types
            #pragma surface surf Standard fullforwardshadows
    
            // Use shader model 3.0 target, to get nicer looking lighting
            #pragma target 3.0
    
            struct Input
            {
    
            };
    
    		float _Red;
    		float _Green;
    		float _Blue;
    		float _Brightness;
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
    			
    			// Albedo comes from a texture tinted by color
    			o.Albedo = float3(_Red, _Green, _Blue) + _Brightness;
    			o.Alpha = c.a;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    

     

    한결 코드가 줄은 것을 확인할 수 있는데요. 이 상태에서 유니티로 들어가보면 아쉽게도 실행이되지 않습니다.

    유니티 콘솔창을 살펴보면 위와 같은 에러가 난 것을 확인할 수 있을겁니다. 즉, 우리가 지운 input 구조체 안에 있던 것이 어떤 용도던 간에 꼭 필요하다는 의미이고, 그것을 지웠기 때문에 에러가 난 것입니다. 아직 책에서도 이곳의 용도를 따로 알려주지 않았기 때문에 뭘 넣어야될지 모르는 상황이지만, 친절하게도 아래와 같이 작성해주면 된다고 하네요 ㅎㅎㅎ

     

            struct Input
            {
    			float4 color : Color;
            };

     

    자, 이렇게 수정을 하고 다시 유니티 에디터로 들어가보면, 또다시 에러가 발생합니다.

    49번째 라인에 있는 c라는 식별자가 정의되지 않았다는 이야기인데요. fixed4로 정의되어 있던 c 변수를 삭제했으므로 당연한 오류입니다. o.Alpha = c.a 라고 되어 있는 부분을 그냥 1로 변경해줍시다.

    o.Alpha = 1;

     

    이제 정말 오류 없이 실행되는 모습을 볼 수 있는데요. 여기서 코드를 조금 더 정리해보겠습니다. 자세히 설명하진 않았지만 지금 당장은 필요없는 구문으로써 LOD와 target3.0이 포함되어 있는 문장을 삭제하겠습니다. 참고로 target 3.0은 쉐이더 모델3.0 이상에서만 돌아가게끔 해서 더 복잡한 코드를 쓸수 있게 해주는 기능이라고 합니다. 지금 당장은 필요가 없겠죠? 이렇게 까지 지워주면 최종 코드는 아래와 같이 된 것을 확인할 수 있을겁니다.

     

    Shader "Custom/NewSurfaceShader"
    {
        Properties
        {
    
    		_Red("Red", Range(0, 1)) = 0.0
    		_Green("Green", Range(0, 1)) = 0.0
    		_Blue("Blue", Range(0, 1)) = 0.0
    		_Brightness("Brightness", Range(-1, 1)) = 0.0
    
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            CGPROGRAM
            #pragma surface surf Standard fullforwardshadows
    
            struct Input
            {
    			float4 color : Color;
            };
    
    		float _Red;
    		float _Green;
    		float _Blue;
    		float _Brightness;
    
            void surf (Input IN, inout SurfaceOutputStandard o)
            {
    			
    			// Albedo comes from a texture tinted by color
    			o.Albedo = float3(_Red, _Green, _Blue) + _Brightness;
    			o.Alpha = 1;
            }
            ENDCG
        }
        FallBack "Diffuse"
    }
    

     

    아주 정말 간단해졌죠? 필요한 것과 필요 없는 것을 아는 것은 굉장히 중요한데요. 코드를 정리하면서 필요한 부분만 남겨 놓으니 가독성도 좋고 훨씬 깔끔해진 것 같습니다.

    오늘 포스팅은 여기서 마무리하도록 하겠습니다. 읽어주셔서 감사합니다.

    댓글

Designed by Tistory.