250128

RTFM·2025년 1월 28일

개발 일지

목록 보기
65/350

✅ 오늘 한 일


  • AI 3D 모델링 실험
  • Udemy Unity Shader 강의 수강
  • Project MR


🎮 Random Study


AI 3D 모델링 실험

https://github.com/Tencent/Hunyuan3D-2
https://huggingface.co/spaces/tencent/Hunyuan3D-2

  • 매시 최적화는 안돼있어서 리토폴로지를 따로 해줘야 하긴 한데, 이정도면 괜찮은듯
  • 텍스트만으로는 한계가 있을 거고, 2D 이미지를 ai로 후처리 한 다음 다시 ai로 3D화한 다음 리토폴로지를 거치는 등 여러 작업이 필요하긴 할듯. 결국 workflow를 알긴 해야 한다.


🎞️ Udemy Course : Unity Shader


섹션 1: Introduction

8. Your First Surface Shader

Shader "Holistic/HelloShader" { // Shader set 'Holistic'에 HelloShader라는 이름의 셰이더를 만듬
    Properties { // 셰이더에 input으로 넣어줄 수 있는 필드들 선언하는 곳
        _myColor ("Albedo", Color) = (1,1,1,1)
        _myColor2 ("Emission", Color) = (1,1,1,1)
    }

    SubShader {
        CGPROGRAM // 셰이더 효과들 짜는 코드 영역 (HLSL 영역)
            // 'surf'라는 이름의 surface 셰이더를 Lambert 라이트와 함께 쓰겠다는 선언
            #pragma surface surf Lambert             

            struct Input { // 함수에 쓰일 모델의 데이터들
                float2 uvMainTex;
            };

            fixed4 _myColor; // 프로퍼티 가져오기
            fixed4 _myColor2; // 프로퍼티 가져오기

            void surf (Input IN, inout SurfaceOutput o) { // input을 받아서 surfaceoutput 데이터에 반환
                // Lambert를 쓰고 있으므로 output의 자료형은 SurfaceOutput
                o.Albedo = _myColor.rgb;
                o.Emission = _myColor2.rgb;
            }
        ENDCG
    }

    FallBack "Diffuse"
}


🎮 Project MR


  • 오브젝트들 묶었을 때 피벗은 부모 오브젝트의 위치
  • 좌표에 +1+0.125/2*3 더하여 픽셀 간격 유지

다른 화면 보이게 하기

  • 렌더 텍스쳐는 스프라이트 렌더러와 호환이 안됨
  • Quad 생성해서 매시 렌더러에 머테리얼을 넣거나, 머테리얼을 Unlit/Texture 또는 Sprites/Default로 변경해야 함 (시도해보았으나 되진 않음)
  • 전자가 더 자연스럽고 성능에 유리하다고 함

  • 렌더 텍스쳐 쓰면 일단 보이긴 하는데 알 수 없는 우글거림이 생기고 크기도 약간 다름
  • 렌더 텍스쳐를 사용하려면 해상도 문제를 해결해야 하는 것 같음
  • 머테리얼이 적용되는 quad의 transform이 분명 2d 창과 같은데 위치가 다르길래 뭔가 이상해서 확인해봤더니 3d 공간 상에서 다른 위치를 점유하고 있음
  • 렌더 텍스쳐의 해상도를 조절해봤는데 크기가 그대로임
  • 오버레이 카메라를 시도해봤는데 이건 그냥 적용이 안됨

  • 카메라 viewport rect라는 걸로 해결해보기 위해 수치 조절해가면서 레이아웃 안에 넣었는데 역시 크기가 안 맞음
  • 여러 실험과 o1 질의를 통해 얻은 결론 : 오브젝트의 크기는 카메라 output의 viewport rect에 의해 결정되는 거였다.
  • 임의로 크기를 줄여 창에 맞추는 것이 아니라, 크기는 그대로 두고 masking을 통해 보일 부분을 결정하게 하는 것이 정답인듯.
  • 유일하게 걸리는 부분은 성능 문제. 과연 이것이 최적의 해결책이 맞는가에 대한 의문이 있음. '화면 B를 찍어서 화면 A를 뿌리는 일부분에 오버레이한다'는 간단한 일을 엔진의 제약에 의해 억지로 돌아가야 하는 느낌.
  • UI의 Raw Iamge를 사용하여 위치를 조정하고 masking을 하려고 함
  • 현재 만들어놓은 UI들이 일반 Canvas 기반 UI가 아닌 게임 오브젝트로 구현되어서, 위치를 정확하게 동일하게 조절할 수 없었음
  • 생각해보니 UI를 Canvas 기반 UI로 만든다면 기기 해상도가 달라졌을 시 1픽셀의 크기가 게임 오브젝트와 달라질 수도 있을 것 같다는 생각이 듬. 아직까진 추측. 해상도가 달라졌을 때 UI의 크기가 어떻게 달라지는지에 대한 정보가 필요.
  • 이 글을 보니 셰이더를 이용하면 의외로 간단하게 해결할 수도 있을 것 같다는 생각이 듦.
  • 기존 내장 셰이더들로는 일반 게임 오브젝트에 렌더 텍스쳐를 입힐 수 없었는데, 셰이더 그래프를 이용하면 입힐 수 있을 것 같았음.

  • texture2d 프로퍼티에 받아서 sample texture 2d 노드에 연결한 후에 base color에 그대로 넣었더니 출력은 됨.
  • 크기를 화면 크기와 동일하게 설정해야 오브젝트의 크기도 같아지긴 함.

  • Sprite Mask를 이용하여 정확히 원하는 효과 달성
  • Sprite Mask로 렌더링은 안되지만 raycast는 되는 현상이 향후 일어날 것 같아 gpt에게 해결책이 있냐 물었더니, 그럴싸한 해결책들이 있긴 해서 일단 이대로 진행.
  • sprite shader graph에도 sprite mask 기능이 있는데, 향후 해당 기능에 대해 추가 조사 해보기.
  • stencil buffer로 해결 가능하다는 정보 파악. 역시 추가 조사 해보기.
  • 클릭하면 카메라가 보고 있는 좌표계로 전환해주는 스크립트가 필요할듯. 그 과정에서 sprite mask issue는 자연스럽게 해결될듯.


0개의 댓글