250322

凡愚·2025년 3월 22일

개발 일지

목록 보기
118/350

✅ What I did today


  • Udemy Course : Unity Shader
  • Project BCA


🎞️ Udemy Course : Unity Shader


  1. ~ 13.

Variables and Packed Arrays

  • 셰이더 코드를 짜는 건 픽셀 하나를 위해서 코드를 짜는 것. 따로 loop 돌릴 필요 없다.

Basic Data Types

  • float : 32 bit. 정확도 가장 높음. 월드 위치, 텍스쳐 좌표, 계산에 사용됨.
  • half : 16 bit. float의 절반 크기. 짧은 벡터, 방향, hdr 컬러에 사용됨.
  • fixed : 11bit. 가장 낮은 정확도. 보통의 컬러 연산에 사용됨.
  • int : 카운터나 배열 인덱스로 사용됨.

Texture Data Types

  • sampler2D : 일반 텍스쳐
  • samplerCUBD : 큐브맵 텍스쳐
  • 각각의 뒤에 _half 붙이면 low precision, _float 붙이면 high precision

Packed Array

  • 자료형 뒤에 배열의 길이를 붙이면 된다. 예시) fixed4 colour1 = (0,1,1,0);
  • r,g,b,a 또는 x,y,z,w로 각 요소 접근. 예시) colour1.r = 1;
  • colour1.xgb 이런 식으로 섞어서 쓸 순 없다. colour1.xzy는 가능함.
  • 서로 다른 크기여도 할당하거나 연산할 수 있다. 예시) fixed3 colour3; colour3 = colour1.rgb;
  • fixed3 c = 1;fixed3 c = (1,1,1);은 같은 연산이다.
  • 연산할 채널과 순서를 마음대로 바꿀 수 있다. 예시) colour1.rg = colour2.gr;

Packed Matrices

  • 선언 방법 : float4x4 matrix;
  • 개별 접근 : float myValue = matrix._m00;
  • chaining 예시 1 : fixed4 colour = matrix._m00_m01_m02_m04;
  • chaining 예시 2 : fixed4 colour = matrix[0];
Shader "Holistic/PackedPractice" {
    Properties {
        _myColour ("Example Colour", Color) = (1,1,1,1) // 흰색
    }

    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert

        struct Input {
            float2 uvMainText;
        };

        fixed4 _myColour;

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo.r = _myColour.r;
        }

        ENDCG
    }

    FallBack "Diffuse"
}

The Anatomy of a Mesh and Shader Input

  • Mesh : Vertex Array + Normal Array, UV Array, Triangle Array
  • Unity에선 기본적으로 UV 좌표를 두 개까지 사용할 수 있다. (custom shader 짜면 당연히 한계 넘을 수 있긴 할듯)
  • struct Input으로 mesh를 조작할 수 있다.
  • surface shader function은 Input 파라미터를 사용 안 해도 써놔야 함.
    • float2 uv_MainTex; : UV에 텍스쳐 할당 (앞은 uv나 uv2, 뒤는 텍스쳐 이름)
    • float3 viewDir; : 카메라가 어디에 있는지
    • float3 worldPos; : 월드 좌표계에서의 위치
    • float3 worldRefl; : 어떻게 반사할건지
Shader "Holistic/PackedPractice" {
    Properties {
        _myColour ("Example Colour", Color) = (1,1,1,1) // 흰색
    }

    SubShader {
        CGPROGRAM
        #pragma surface surf Lambert

        struct Input {
            float2 uvMainText;
        };

        fixed4 _myColour;

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo.r = _myColour.r;
        }

        ENDCG
    }

    FallBack "Diffuse"
}

Shader Properties

Shader "Holistic/AllProps"
{
    Properties {
        _myColor ("Example Color", Color) = (1,1,1,1)
        _myRange ("Example Range", Range(0,5)) = 1
        _myTex ("Example Texture", 2D) = "white" {}
        _myCube ("Example Cube", CUBE) = "" {}
        _myFloat ("Example Float", Float) = 0.5
        _myVector ("Example Vector", Vector) = (0.5,1,1,1)
    }
    SubShader {
        
      CGPROGRAM
        #pragma surface surf Lambert

        fixed4 _myColor;
        half _myRange;
        sampler2D _myTex;
        samplerCUBE _myCube;
        float _myFloat;
        float4 _myVector;

        struct Input {
            float2 uv_myTex;
            float3 worldRefl;
        };

        void surf (Input IN, inout SurfaceOutput o) {
            o.Albedo = (tex2D(_myTex, IN.uv_myTex) * _myRange).rgb; // _myTex를 _myRange만큼 곱한 값으로 Albedo를 설정
            o.Emission = texCUBE(_myCube, IN.worldRefl).rgb; // 설정한 CUBE map을 반사
        }

        ENDCG
    }
    Fallback "Diffuse"
}


🎮 Project BCA


  • 서사를 보여주는 순서를 뒤로 보내면 의외성으로 인해 좀 더 흥미로워질 것.
  • 내놓기 부끄러운 쓰레기에서 그럴듯한 쓰레기가 될 것 같음.
  • 시간을 더 들여서 게임 플레이에 추가 요소를 넣어도 될듯함. 랜덤성을 추가할 생각.

Gatcha machine

모델 : https://sketchfab.com/3d-models/gachagacha-277bc58692734ac8add38db7b839dd8e

  • f로 vertex 연결, subdivide로 연결할 점 만든 후 N > Item으로 길이 확인하여 같은 높이로 변경
  • 버튼과 같은 구멍을 남기고 싶으면 boolean 후 수정

모델링을 뜯어 고쳤다.

'진짜로' 작동하는 가챠 기계보단 대충 덜걱거리는 모션만 주고 캡슐은 instantiate하면 심각한 위화감 없을 것.
그것보다 더 문제는 기계가 하나 추가돼서 화면의 밸런스도 안 맞고 살짝 부자연스러워졌다는 것.

빨간 페인트 : https://www.fab.com/listings/3b6dbce7-fbb4-46b3-bee6-1485b9b407b6

평소에는 안 보이다가
필요할 때만 조명 켜고 클로즈업한 뒤 가챠 연출하면 될듯.

트리거는 코인으로, 동전이 살짝 엇갈려서 세로로 쌓여있는데
클릭하면 조명 켜지면서 카메라 이동. 동전 가져와서 넣고 레버 수동으로 드르륵.

볼도 만들어서 추가. 약간 어색하긴 하지만 나중에 폴리싱하면 되는거니까.



0개의 댓글