Abstract
This study proposes a real-time rendering algorithm for lighting when each of more than 100,000 moving particles exists as a light source. Two 3D textures are used to dynamically determine the range of influence of each light, and the first 3D texture has light color and the second 3D texture has light direction information. Each frame goes through two steps. The first step is to update the particle information required for 3D texture initialization and rendering based on the Compute shader. Convert the particle position to the sampling coordinates of the 3D texture, and based on this coordinate, update the colour sum of the particle lights affecting the corresponding voxels for the first 3D texture and the sum of the directional vectors from the corresponding voxels to the particle lights for the second 3D texture. The second stage operates on a general rendering pipeline. Based on the polygon world position to be rendered first, the exact sampling coordinates of the 3D texture updated in the first step are calculated. Since the sample coordinates correspond 1:1 to the size of the 3D texture and the size of the game world, use the world coordinates of the pixel as the sampling coordinates. Lighting process is carried out based on the color of the sampled pixel and the direction vector of the light. The 3D texture corresponds 1:1 to the actual game world and assumes a minimum unit of 1m, but in areas smaller than 1m, problems such as stairs caused by resolution restrictions occur. Interpolation and super sampling are performed during texture sampling to improve these problems. Measurements of the time taken to render a frame showed that 146 ms was spent on the forward lighting pipeline, 46 ms on the defered lighting pipeline when the number of particles was 262144, and 214 ms on the forward lighting pipeline and 104 ms on the deferred lighting pipeline when the number of particle lights was 1,024766.
본 연구는 10만 개 이상의 움직이는 파티클 각각이 발광원으로서 존재할 때 라이팅을 위한 실시간 렌더링 알고리즘을 제안한다. 각 라이트의 영향 범위를 동적으로 파악하기 위해 2개의 3D 텍스처를 사용하며 첫 번째 텍스처는 라이트 색상 두 번째 텍스처는 라이트 방향 정보를 가진다. 각 프레임마다 두 단계를 거친다. 첫 단계는 Compute shader 기반으로 3D 텍스처 초기화 및 렌더링에 필요한 파티클 정보를 갱신하는 단계이다. 이때 파티클 위치를 3D 텍스처의 샘플링 좌표로 변환 후 이 좌표를 기반으로 첫 번째 3D 텍스처엔 해당 복셀에 대해 영향을 미치는 파티클 라이트들의 색상 총합을, 그리고 두 번째 3D 텍스처에 해당 복셀에서 파티클 라이트들로 향하는 방향벡터들의 총합을 갱신한다. 두 번째 단계는 일반 렌더링 파이프라인을 기반으로 동작한다. 먼저 렌더링 될 폴리곤 위치를 기반으로 첫 번째 단계에서 갱신된 3D 텍스처의 정확한 샘플링 좌표를 계산한다. 샘플링 좌표는 3D 텍스쳐의 크기와 게임 월드의 크기가 1:1로 대응하므로 픽셀의 월드좌표를 그대로 샘플링 좌표로 사용한다. 샘플링한 픽셀의 색상과 라이트의 방향벡터를 기반으로 라이팅 처리를 수행한다. 3D 텍스처가 실제 게임 월드와 1:1로 대응하며 최소 단위를 1m로 가정하는데 1m보다 작은 영역의 경우 해상도 제한에 의한 계단 현상 등의 문제가 발생한다. 이러한 문제를 개선하기 위한 텍스처 샘플링 시 보간 및 슈퍼 샘플링을 수행한다. 한 프레임을 렌더링하는데 소요된 시간을 측정한 결과 파티클이 라이트의 개수가 262144개일 때 Forward Lighting 파이프라인에서 146ms, deferred Lighting 파이프라인에서 46ms 가 소요되었으며, 파티클 라이트의 개수가 1024576개일 때 Forward Lighting 파이프라인에서 214ms, Deferred Lighting 파이프라인에서 104ms 가 소요되었다.