전체 글 116

TBR(Tile-based Render)

전통적으로 데스크톱의 그래픽에서는 드로우콜마다 프레임 버퍼 전체를 갱신합니다. 하지만 높은 해상도의 프레임버퍼 전체를 매 번 갱신하는 것은 높은 메모리 대역폭을 요구하게 됩니다. 따라서 모바일에서는 프레임버퍼 전체를 매 번 갱신하는것이 아니라 타일 단위로 쪼개서 갱신을 하는 방식을 사용합니다. 드로우콜 발생 시 즉시 프레임버퍼에 기록하는 것이 아니라, 칩셋에 내장된 메모리에 존재하는 타일에 렌더링합니다. 이로 인해서 매번 화면 전체를 렌더링 하는 것이 아니라 실제 도형이 그려지는 타일만 렌더링 하게 됩니다. 우선, 프레임버퍼를 일정 크기의 타일로 영역을 나눕니다. (이 타일 크기는 칩셋 벤더마다 차이가 있습니다.) 드로우콜이 발생하면 지오메트리 데이터가 버텍스쉐이더를 거쳐서 트랜스폼을 수행 후 레스터화됩..

3D Rendering 2023.09.28

Deffered Render 메모리 대역폭 문제

대역폭은 메모리에서 한 번에 빼낼 수 있는 데이터의 양을 의미한다 디스플레이와 동일한 크기의 메모리를 여러개 할당하여 렌더링 데이터를 저장해야하므로 메모리 대역폭을 많이 필요로 하게되어 대역폭의 문제가 발생한다. 디스플레이의 크기와 해상도가 좋아질 수록 더욱 큰 대역폭을 요구하게 되는 것이 문제 모바일의 같은 경우에는 대역폭이 낮으므로 디퍼드를 적용하기 어렵다

3D Rendering 2023.09.28

Light Pre-Pass

디퍼드 셰이더의 과정을 모두 거쳐서 결과물을 Lit Buffer(라이트 버퍼)에 저장하고 똑같은 물체를 다시 Forward형식으로 라이팅을빼고 그려서 Lit Buffer의 결과물과 합성하여 그린다. 이런 방식을 통해서 디퍼드의 단점인 다양한 Material을 다루기 힘들다는, 특히 투명도가 있는 물체를 다루기 어렵다는 부분을 보완한다 하지만 물체를 디퍼드와 포워드로 두 번 그리기때문에 DrawCall이 2배가 된다.

3D Rendering 2023.09.28

Deffered Render

※ 디퍼드 렌더링 Forward에서 Gemetry이후 Geometry Buffer(G-Buffer)라고 부르는 씬에서 라이팅을 처리하기 위해 필요한 데이터들을 나누어 저장하는 공간에 저장한다. 각 저장공간을 모두 다 합쳐서 G-Buffer라고 부른다. 렌더링에 필요한 데이터들을 나누어 저장한다. 각 저장공간을 렌더타겟이라고 부르고 여러 개의 렌더타겟을 사용해 멀티 렌더 타겟을 사용한다고 한다. MRT(Multi Render Target)이라고 부른다. 디퍼드에서는 MRT를 이용해 화면에 그려질 픽셀의 데이터를 MRT에 전부 수집한 후 라이팅 연산을 한 번에 처리한다. Forward의 경우에는 위의 설명처럼 물체마다 덧그리기를 진행하여 그리기를 시행한다. First Pass 1번째 파이프라인과정에서는 GB..

3D Rendering 2023.09.28

Forward Render

※ 포워드 렌더링 * Vertex Pragment(버텍스 셰이더) - World/View/Projection의 변환 연산이 일어난 지점 * Geometry Pragment(지오매트리 셰이더) - 버텍스 셰이더를 거친 정점들을 이용해 도형을 구성한다. - Projection을 거친 정점은 절두체컬링을 통해 제거된 정점을 삼각형의 한꼭지점으로 가져서 삼각형의 형태를 잃어버릴 수 있다. 이런 경우에 여기서 새로운 정점을 생성하여 도형의 형태를 바꾸거나 전달받은 정점을 이용해 더욱 세밀한 도형을 표현하기위해 정점을 분할하여 더 세분화된 형태로 바꾸어 새롭게 도형의 형태를 구성할 수 있다. 그 단계를 여기서 진행한다. * Clipping Restarization - 정점을 통해 구성된 도형의 픽셀들을 화면에 표현..

3D Rendering 2023.09.28

Phong Shader(3D SoftRendering)

C++로 연산한 Phongshader의 코드만을 가져와서 기록 호출되는 함수의 내부를 보면 해당 연산으로 구성되어 있는데 하나씩 뜯어보겠다. 첫번째 문단 * 첫번째 Lighting은 현재 렌더링 되어질 공간에 존재하는 광원을 가져오는 것이다. 주석에 적힌대로 방향광을 전제로 하였으며 광원은 하나만 존재하도록 하였다. - l_DirLight : 방향광의 방향을 나타내는 벡터 - ldotPixNor : 내적을 통해 방향광과 픽셀노말이 이루는 사잇각의 값을 구한 것이다. 이때 사용된 픽셀 노말은 구체를 생성할 때 물체 중심부의 중점과 정점을 이용해 정점의 노말을 구하고, 픽셀을 포함하고 있는 폴리곤의 정점노말 값과 폴리곤의 무게중심좌표계를 이용하여 각 픽셀의 노말값을 구한 것이다. 정점을 이용해 외적하여 구한..

3D Rendering 2023.09.28