2진 트리
실내 지형 공간 분할(방 단위로 분할)
창문이나 문 같이 외부와 연결되는 지점에 Rendering을 위해 실제로 Object를 배치하는 것이 아니라 연결 지점에 평면을 생성한 후 평면에 외부의 모습을 rendering하는 방식
정식 Graphics Pipeline에 포함되어있지는 않은 Shader stage
CPU에서 처리할 연산을 GPU에서 처리한 후 반환받는 것
단, CPU-GPU간의 데이터 송수신에 필요한 소요시간으로 인해 실제로 성능이 향상되는지는 점검해봐야 함
Texture 생성 등에서 사용
기존의 Rendering방식은 동기화 방식으로 CPU에서 GPU에게 Rendering 요청을 하면 GPU에서 반환받을 때까지 대기한 후 다시 CPU에서 연산을 수행
즉, CPU와 GPU가 동시에 수행되지 않음
Multi Thread Rendering의 경우 CPU에서는 GPU에게 Rendering 요청을 한 후, 결과를 반환받지 않더라도 돌아와서 CPU만의 연산을 수행, GPU는 요청받은 Rendering command를 Queue에 저장한 후 차례대로 수행하는 방식
IOCP나 Async방식의 통신과 비슷한 느낌
Vertex 정보를 넘길 때, 꼭 UV데이터를 포함해서 넘길 필요는 없음
예를 들어 Map의 Vertex의 경우 그 양이 매우 방대한데, UV, Color를 제외한 Position, Normal만 Vertex의 정보로 전달한 후, Position이나 Normal의 정보만을 이용해서 Texture의 UV좌표를 계산하는 기법
만약, y좌표의 위치가 50 이하라면 A Texture, 50 이상이라면 B Texture를 선택해서 Texturing하고, 그 사이는 적절하게 blend한다면 높이에 따라 적절하게 Blending된 1장의 Texture를 얻을 수 있을것이다
또한, 0 < UV < 1에 포함되지 않는 UV는 Render State의 설정에 따라서 Tiling 될 수 있으므로 자동으로 Tile된 Texture를 얻을 수 있음
그 외에도 Normal, View Space Coordinate, Projection Space Coordinate 등 다양한 값을 매개변수로 사용할 수 있음
만약 사용자가 Map의 크기를 이 아닌 크기를 결정했다면 (Vertex를 기준으로 자를 수 없다면) 그보다 약간 큰 크기의 Map을 만든 후, 해당하지 않는 위치의 Node는 Dummy로 설정
Child가 유효한지 아닌지에 대한 확인 필요
Map의 크기를 미리 설정하지 않고 Model을 미리 만든 후 공간 분할을 한다면 수동으로 분할하고자 하는 지점을 결정할 수 있어야 한다
Leaf Node에 1개의 Object를 온전하게 저장할 수 있음(절차적으로 분할한다면 그 경계에 속한 Object는 분할되거나 포함 지점을 결정해야 한다)
일반적으로 지형을 단순한 Random함수를 이용해서 생성할 경우 지표면이 자글자글하게 생성된다
그 대신 Perlin Noise를 이용해서 생성한 다수의 Texture의 합으로 자연스러운 1장의 Height Map을 생성하는 기법
더 많은 Paramter를 이용해서 Texture를 만드는 방법?
추가 조사 필요
OpenGL을 이용해서 Shader의 기법을 설명한 사이트
Source의 Height Map으로부터 Vertex를 줄여서 LOD와 주위 LOD의 연결상태에 따른 Index Buffer를 미리 생성하는 기법
단, 주변의 LOD가 2단계 이상 차이가 날 경우 Crack 발생의 위험 존재(고산지대에서 저지대를 바라보는 경우) - LOD의 간격을 넓게 잡으면 눈에 띄지 않을 정도로 사용 가능
LOD의 목적은 Draw Primitive의 크기를 줄이는 것이므로 꼭 Patch의 모든 Vertex를 살릴 필요 없이, Patch의 인접 Face만 처리해도 문제는 없음
A Area에 있던 Object가 B로 움직이던 중 그 경계에 속한다면 해당 Object는 A에 속하는지 B에 속하는지 결정하기 어려움
이를 막기위해 경계를 기준으로 일정한 범위의 Threshold를 생성한 후 해당 Threshold를 넘었을 때 다른 Area에 속한다고 판단하는 기법
LOD의 단계를 결정할 때, Network에서 Player의 행동에 대한 Packet 전송 여부를 결정할 때 등에서 사용 가능
이외에도 각도 판정 등에서 다양한 방식으로 사용 가능