수퍼샘플링(Supersampling)은 이미지 렌더링 기술 중 하나로, 이미지의 품질을 향상시키기 위해 사용됩니다. 이 기법은 픽셀의 색상을 결정하기 위해 더 높은 해상도로 이미지를 렌더링한 다음, 이 고해상도 이미지를 다시 낮은 해상도로 축소하여 최종 이미지를 생성하는 방식입니다.
주요 개념:
- 고해상도 샘플링: 수퍼샘플링은 기본 해상도보다 높은 해상도로 이미지를 생성합니다. 예를 들어, 1920x1080 해상도의 화면에서 3840x2160 해상도로 이미지를 렌더링하는 것입니다.
- 픽셀 평균화: 고해상도로 렌더링한 후, 해당 이미지의 픽셀을 평균 내어 낮은 해상도로 축소합니다. 이 과정에서 픽셀 간의 색상 차이가 줄어들어 더 부드러운 경계선과 더 나은 디테일을 얻을 수 있습니다.
- 안티앨리어싱: 수퍼샘플링은 앨리어싱을 줄이는 데 효과적입니다. 경계선이 부드럽고 자연스럽게 보이도록 도와줍니다.
장점:
- 향상된 이미지 품질: 경계선의 계단 현상(앨리어싱)을 줄여주어 더 매끄럽고 자연스러운 이미지를 생성합니다.
- 디테일 증가: 고해상도로 렌더링함으로써 이미지의 세부 사항을 더 잘 표현할 수 있습니다.
단점:
- 성능 비용: 수퍼샘플링은 렌더링 과정에서 필요한 계산량이 많기 때문에 GPU 성능에 큰 부담을 줄 수 있습니다. 고해상도로 렌더링하고 축소하는 과정이 시간이 많이 걸립니다.
- 메모리 사용량: 높은 해상도로 렌더링하면 메모리 사용량도 증가합니다.
그림으로 이해해봅시다.
이미지의 하나의 픽셀에 대한 그림을 다음과 같다고 생각해봅시다.

그리고 렌더링하면 약간 이렇게 울퉁불퉁합니다.

이유는 다음 과 같습니다.

수퍼샘플링이란 주위 값들을 평균내어 다시 원래 픽셀 컬러값에 할당해주는 것입니다.

dx는 픽셀 하나의 가로or세로 길이입니다. 재귀문을통해 얼마나 반복할지 정합니다.
코드를 통해 이해해봅시다
vec3 traceRay2x2(vec3 eyePos, vec3 pixelPos, const float dx, const int recursiveLevel)
{
if (recursiveLevel == 0)
{
Ray myRay{pixelPos, glm::normalize(pixelPos - eyePos)};
return traceRay(myRay);
}
const float subdx = 0.5f * dx;
vec3 pixelColor(0.0f);
pixelPos = vec3(pixelPos.x - subdx * 0.5f, pixelPos.y - subdx * 0.5f, pixelPos.z);
for(int i = 0 ; i< 2 ; i++)
for (int j = 0; j < 2; j++)
{
vec3 subPos = vec3(pixelPos.x + subdx*i, pixelPos.y + subdx*j, pixelPos.z);
pixelColor += traceRay2x2(eyePos, subPos, subdx, recursiveLevel - 1);
}
return pixelColor * 0.25f;
}//https://honglab.co.kr/courses/graphicspt1
//홍정모 그래픽스 새싹코스1(수퍼샘플링)
결과는 다음과 같습니다

강의 출처 :
https://honglab.co.kr/courses/graphicspt1
HongLab 홍정모 연구소
홍정모의 컴퓨터 그래픽스 새싹코스
honglab.co.kr
'Graphics Techniques' 카테고리의 다른 글
[Ray Tracing] - 투명한 구의 빛의 굴절 (1) | 2024.10.22 |
---|---|
[Ray Tracing] - 빛의 반사(거울반사) (0) | 2024.10.22 |
[Ray Tracing] 월드좌표 도형에 텍스춰링 하는 방법 (4) | 2024.10.20 |
[Ray Tracing] Barycentric coordinates(무게 중심 좌표계)를 통한 텍스쳐 좌표 보간 (2) | 2024.10.17 |
[Ray Tracing] 광선과 삼각형의 충돌을 통해 삼각형 그리기 (0) | 2024.10.16 |