250322

lililllilillll·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

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

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

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



profile
너 정말 **핵심**을 찔렀어

0개의 댓글