241128

凡愚·2024년 11월 28일

개발 일지

목록 보기
4/350

✅ 오늘 한 일


  • 이력서 다듬기
  • 백준 1문제 풀기
  • ProPixelizer 사용법 익히기
  • '한 권으로 끝내는 블랜더 교과서' 읽기
  • '게임 엔진 아키텍처' 읽기


🎮 유니티 공부


ProPixelizer

https://assetstore.unity.com/packages/vfx/shaders/fullscreen-camera-effects/propixelizer-realtime-3d-pixel-art-177877

기능

  • 오브젝트를 저화질처럼 픽셀화해서 렌더링해줌
  • 움직일 때 pixel creep(픽셀 단위에서 어그러지는 현상) 안 일어남
  • 오브젝트별 윤곽선 조절
  • 실시간 조명 및 그림자
  • 오브젝트별 색상 보정
  • SRP랑 ShaderGraph 지원
  • URP 포스트 프로세싱 효과랑 호환됨 (depth of field나 bloom 등)

소개 영상 : https://youtu.be/q4epArkvVnE?si=JXCk6sbqx4woS5PL&t=1030

User Guide 읽기

유저 가이드 : https://sites.google.com/view/propixelizer/user-guide?authuser=0

요구 사항 : URP

이걸로 빌드해도 돌아감

  • WebGL
  • 윈도우, 다렉, opengl
  • 안드로이드 (근데 본인 구린 A10으로는 좀 렉걸림)

어떻게 작동하는지 간략 설명 : https://medium.com/@elliotbentine/pixelizing-3d-objects-b55ec33328f1

Getting Started

일단 프로젝트에 URP 패키지 추가돼있어야 함
패키지 매니저에서 ProPixelizer import 하셈.

Shader Variant Limit이 너무 낮게 설정돼있으면, 콘솔에 경고 뜰거임.
Edit > Preferences > Shader Graph에서 256 정도로 높이고 우클릭 - reimport 하셈.

Setting up the Project

  1. 애셋에 포함된 ProPixelizer render pipeline asset을 쓸 수도 있고,
  2. 설명서 보고 네 렌더 파이프 라인에 ProPixelizer 추가할 수도 있음

Project Settings > GraphicsProject Settings > Quality에 렌더 파이프라인을 설정해야 함.
하나라도 안 하면 ProPixelizer에서 경고할거임.
요즘 버전 URP는 기본적으로 quality setting마다 RenderPiplelineAssets가 연결돼있음

렌더 파이프라인에 ProPixelizer 추가하기

URP에서

  • Depth Texture가 켜져있어야되고
  • MSAA가 꺼져 있어야 됨

카메라 수준에서도 재정의 가능


가독성이 떨어진다. 번역의 의미가 별로 없는 것 같다.
내가 이걸 해서 무엇을 얻는지가 불분명.
차라리 한 번 써보고 어떻게 쓰는지 내 방식대로 적는게 더 나을 것 같음.

Project Settings - Quality 보니까 HighFidelity로 설정돼있길래 그것만 설정 적용

MSAA 안 껏더니 이런 오류
끄니까 사라짐

Renderer에 원래 붙어있는 Screen Space Ambient Occlusion도 끄는듯

이거 뭐라는거임
오브젝트 여러 개 선택한다음 mesh renderer에 material 추가하고 순서 바꾸려고 했더니 이러는데

메시지 내용

  • "Duplicating an array element will copy the complete array to all other selected objects."

    • 배열 요소를 복제하면 선택된 모든 오브젝트에 동일한 배열(예: Material Slot 배열)이 복사됩니다.
  • "Unique values in the different selected objects will be lost."

    • 만약 선택한 오브젝트마다 Material 배열이 다르다면, 해당 배열의 고유한 값이 모두 동일한 값으로 덮어씌워집니다.

왜 이런 일이 발생하는가?

  • Unity에서 여러 오브젝트를 선택한 상태로 Mesh Renderer의 Materials 배열을 수정하면, 모든 오브젝트의 Material 배열이 동일하게 설정됩니다.
  • 순서를 바꾸거나 배열 요소를 추가하려는 행동이 "배열을 복제(Duplicate Array)"로 간주되어, 선택된 모든 오브젝트에 동일한 배열을 적용하려고 시도하는 것입니다.

내 애셋에 material 넣어보긴 했는데

제대로 하는거 맞는지 모르겠네
아무 개념도 모르고 그냥 따라만 하니까 너무 답답

일단 공부를 해서 뭐라도 안 후에 애셋 건드리는게 맞는 순서인듯



📖 한 권으로 끝내는 블렌더 교과서


1 블랜더 환경 이해 및 기본 학습

1.3 Interface & Controls

우측 상단 Sidebar : 오브젝트의 좌표, 크기, 회전 등의 정보를 정밀하게 조절할 때 사용. 내 거에선 N을 눌러야 등장했다.

우측 상단 Navigate : 시점 변경 가능

Operation :

각 오브젝트의 메시 옵션들이 나타나므로 항상 옵션 창을 표시한 상태로 작업하는 것을 권장합니다. 이 창은 세부적인 수치를 조정할 때 더 효율적입니다. 메시를 생성할 때 상세한 치수를 정밀하게 조절합니다.

라고 나와있는데, 불러내는 방법도 그냥 Add - Mesh - Cube가 아니라 Add Cube라는 걸로 수상하게 새로 생성해야 나옴. 그것도 클릭하면 바로 사라짐.

찾아보니까 Edit - Adjust Last Adjust 하면 다시 튀어나온다길래 해봤더니 되긴 됨. 근데 이걸 왜 해야되는지는 아직 의문.



📖 게임 엔진 아키텍처


2장 도구

2.2 컴파일러, 링커, IDE

2.2.3 프로젝트와 솔루션

비주얼 스튜디오에서
프로젝트 : 소스 파일 모음으로, 컴파일해서 라이브러리나 실행 파일, DLL을 만든다. XML 형태라서 사람이 읽고 수정 가능.
솔루션 : 프로젝트의 모음으로, 여러 개의 라이브러리와 실행 파일, DLL을 만든다.

2.2.4 빌드 설정

현대 컴파일러는 옵션이 많아서 매번 코드 빌드할 때마다 옵션을 지정하면 실수하니까 '빌드 설정'이라는 걸 만들어놨다.
빌드 설정은 각 프로젝트에 쓸 전처리기, 컴파일러, 링커의 모든 옵션을 모아놓은 것이다.

비주얼 스튜디오에서 새 프로젝트/솔루션 만들면 기본적으로 'Debug'와 'Release' 2개의 빌드 설정을 가진다.



⚔️ 백준


📌 30460 스위치

# 앞으로 이번 포함 3번의 점수를 2배 얻을 수 있다는 뜻
# 세 개 묶음으로 골라서 2배 처리
# 일단 양수여야 고른다
# 전부 다 계산한 후에 그 중에 제일 큰 거 고르는
# 123 골랐을 때 이후 계산들은 123 결과를 무조건 이용한다 -> dp?

# 123을 2배시키기로 했다면 234, 345는 2배시키지 못함.
# 따라서, 123을 2배시켰다면 234, 345를 2배시키는 세계선의 최댓값들도 보고 와야함

# 123선택한 다음 2374, 345 세계선도 보고 오는 dfs
# 123 선택했다면 다음 선택지는 양수일때까지 거르고 거르다가 양수 나오면 고르기
# 선택지+2가 한계보다 높다면 그대로 끝

# dp는 굳이 적을 필요도 없고 하면 메모리 펑

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)

def three_sum(sb,i):
    return sb[i]+sb[i+1]+sb[i+2]

def max_val(sb,idx,val):
    global N

    if(idx+3 > N):
        for i in range(idx,N):
            val += sb[i]
        return val        

    if (three_sum(sb,idx) < 0):
        return -float('inf')

    for i in range(idx,idx+2):
        if(i<N-2):
            val = max(val,max_val(sb,i,val) + three_sum(i))
    
    return val

N=int(input())
score_board=list(map(int,input().split()))
print(max_val(score_board,0,0))

이걸로 너무 시간 끌면 안될 것 같아서 일단 내일로 넘기기



0개의 댓글