목록Technology (223)
Develog
Shader Graph셰이더 그래프(Shader Graph)는 노드 기반으로 셰이더(Shader)를 제작할 수 있는 패키지.렌더 파이프라인(Render Pipeline)의 종류와 무관하게 사용할 수 있다.셰이더 그래프으로 제작한 에셋을 하나의 렌더 파이프라인에서 제작한 다음, 다른 렌더 파이프라인으로 옮기는 것이 이론상 가능은 하지만 호환성 문제가 있어 권장되지는 않는다. 가급적 셰이더 그래프를 작성하기 전에 렌더 파이프라인을 먼저 설정하는 것이 좋다.셰이더 그래프 에셋을 생성하면 아래와 같은 기본 설정값을 볼 수 있다.위 사진 속 Vertex, Fragment라고 적힌 2개의 박스는 각각 셰이더 스테이지(Shader Stage)를 의미한다.즉, 별다른 처리 없이 URP 셰이더 그래프를 처음 사용하게 된..
디스플레이 파이프라인 (Display Pipeline)3D 이미지를 컴퓨터가 생성하는 일련의 단계.표시할 객체들을 개별 모델에서 메모리로 불러온다. 수학적 함수를 적용해 모델들을 공통 좌표계(월드 뷰)로 변환한다. 카메라 시점에서 모델을 근사하는 다각형(삼각형)을 생성한다. 생성된 다각형들을 렌더링한다. 렌더링 된 모델에 텍스처를 적용하여 이미지를 생성한다. 결과 이미지에 특수 효과를 결합하여 프레임버퍼로 이동시킨다. GPU가 프레임버퍼에 도착한 데이터를 바탕으로 이미지를 생성한다.위와 같은 각 단계는 진행될수록 더 많은 메모리와 대역폭, 연산 속도를 요구한다. 이는 GPU가 많은 발열과 전력, 높은 대역폭 및 고성능 비디오 메모리 등을 요구하는 이유와도 연결된다.타일 렌더링 (Tile Rendering..
보틀넥 문제 (Bottle neck)GPU가 연산하는데 필요한 모든 소스 데이터는 CPU를 통해 가져와야 한다.(정점 좌표, 면의 순서, 광원 좌표 등)컴퓨터는 기본적으로 CPU, GPU, DRAM 등 다양한 역할을 담당하는 부품이 모여서 구성된 복합체다. 이 때문에 특정 부품의 성능이 다른 부품의 성능보다 상대적으로 떨어진다면 병목 현상이 발생해 전체적인 성능이 떨어질 수밖에 없다.즉, 컴퓨터의 전체 성능은 여러 부품 중에서 가장 느린 성능을 지닌 부품의 속도에 맞게 결정된다. GPU의 경우, 연산에 필요한 데이터를 비디오 메모리에서 가져오는 단계에서 성능이 떨어지는 상황이 흔히 발생한다.그 중에서도 텍스처는 가장 흔히 보틀넥 문제를 일으키는 요소로 지목된다. 용량이 너무 큰 텍스처 데이터를 한꺼번에 ..
CPU와 GPUCPU는 복잡한 연산의 순차 처리에 특화되어 있는 유닛(Unit)이지만, GPU는 단순한 연산의 병렬 처리에 특화되어 있는 유닛이다. 이러한 구조적인 차이 때문에 CPU에서 픽셀 단위의 연산을 처리한다면, 픽셀의 수만큼 엄청난 양의 연산을 순차적으로 반복해야 한다. (1920 * 1080 = 2,073,600번)(참고: https://youtu.be/ZrJeYFxpUyQ?si=rDr9yryrzvMwzwa8)드로우 콜 (Draw Call)복잡한 처리를 CPU가 먼저 처리한 다음, GPU에 '완벽하게 준비된 데이터'만 전달하여 빠른 속도로 계산만 진행한다. 이때, CPU가 GPU에게 '그리기' 명령을 내리는 것을 드로우 콜(Draw Call)이라고 부른다.드로우 콜을 받은 GPU는 CPU에서 ..
1. 문자열Python은 문자열을 다룰 때 정말 강력한 성능을 발휘하는 언어 중 하나입니다.문자열을 자르고, 붙이고, 곱하고, 더하는 등 직관적이고 사고공학적(?)인 구조를 지니고 있어 유연하게 활용할 수 있습니다.문자열을 가공할 때는 물론, 문자열을 출력할 때도 이러한 Python의 장점이 발휘됩니다.repr( )과 str( )이 그것입니다. 2. repr( )문자열로 객체를 다시 생성하고자 할 때 사용됩니다.import datetimea = datetime.datetime(2017, 9, 27)str(a)>>> '2017-09-27 00:00:00'a = datetime.datetime(2017, 9, 27)repr(a)>>> 'datetime.datetime(2017, 9, 27, 0, 0)'문자..
1. C++ 진짜 싫다아니 대체 이런 언어를 왜 쓰는 거죠.프레임워크를 설치하든, 코드를 짜든, 문법 배운 거 실습을 하든 도통 뭘 하든 간에 제대로 돌아가는 꼴을 못 봤습니다.버전은 어마어마하고, 책임은 몽땅 프로그래머한테 떠넘기고, OS마다 컴파일러마다 파편화는 아찔한 수준이고, 패키지든 프레임워크든 뭐 하나 설치만 하면 에러부터 뿜어대고...Catch2요?아니 유닛 테스트를 위해서 쓸 수 있는 좋은 프레임워크라고 소개하면 뭐 합니까, 설치해서 쓸려고 해도 에러만 토해내는데!초보자 입장인 저에게는 C++이 너무나도 싫습니다. 문법 괴팍하다고 한동한 멀리하던 Python이 선녀로 보이는 수준입니다.아니 패키지 설치하라고 할 때마다, 새로운 문법을 하나씩 배울 때마다 늘 새롭고 재밌지가 않아요. 겁부터 ..
1. 템플릿템플릿은 C++에서 제네릭을 구현하기 위해 사용되는 문법입니다.타입을 고정시키지 않고 경우에 따라 다양한 타입의 값을 받아 동작시킬 수 있기 때문에 보다 유연하고, 재사용성이 높은 코드를 작성하는 것이 가능해집니다.template struct AutoBrake { AutoBrake(const T& publish) : publish{ publish } {} void observe(const SpeedUpdate& cd) {} void observe(const CarDetected& cd) {} void set_collision_threshold_s(double x) { collision_threshold_s = x; } double get_speed_..
1. 상수상수는 변수와 달리 고정된 값을 다루기 위해 사용되는 개념입니다.상수로 정의된 값은 코드가 실행되는 동안 변경되지 않는다는 것을 보장할 수 있기 때문에 데이터의 신뢰성을 높일 수 있습니다.이 때문에 원주율(PI), 랜덤 확률 등과 같이 코드 내에서 고정적으로 사용되는 공통 값을 다룰 때는 상수로 정의하여 가독성을 높이는 방안을 주로 사용합니다. C++에서는 이 상수를 다룰 때 const와 constexpr이라는 두 가지 접근성을 보장합니다.여기서는 const와 constexper이 어떻게 다른지 간략히 살펴봅니다. 2. const먼저 const는 변수와 함께 사용되며 const는 함수나 생성자를 정의할 때는 사용되지 않습니다.const를 통해 정의된 값은 컴파일 타임 또는 런타임에 값이 결정됩..