상당히 전형적인 레이트 레이싱 메인 루프를 가정 해 봅시다 :
struct Ray
{
vec3 origin;
vec3 direction;
};
RGBColor* image = CreateImageBuffer(width, height);
for (int j=0; j < height; ++i)
{
for (int i=0; i < width; ++i)
{
float x = 2.0 * (float)i / (float)max(width, height) - 1.0;
float y = 2.0 * (float)j / (float)max(width, height) - 1.0;
vec3 dir = normalize(vec3(x, y, -tanHalfFov));
Ray r = { cameraPosition, dir };
image[width * j + i] = ComputeColor(r);
}
}
4 개의 샘플 MSAA를 수행하기위한 그것의 가능한 수정은 다음과 같습니다 :
float jitterMatrix[4 * 2] = {
-1.0/4.0, 3.0/4.0,
3.0/4.0, 1.0/3.0,
-3.0/4.0, -1.0/4.0,
1.0/4.0, -3.0/4.0,
};
for (int j=0; j < height; ++i)
{
for (int i=0; i < width; ++i)
{
// Init the pixel to 100% black (no light).
image[width * j + i] = RGBColor(0.0);
// Accumulate light for N samples.
for (int sample = 0; sample < 4; ++sample)
{
float x = 2.0 * (i + jitterMatrix[2*sample]) / (float)max(width, height) - 1.0;
float y = 2.0 * (i + jitterMatrix[2*sample+1]) / (float)max(width, height) - 1.0;
vec3 dir = normalize(vec3(x, y, -tanHalfFov) + jitter);
Ray r = { cameraPosition, dir };
image[width * j + i] += ComputeColor(r);
}
// Get the average.
image[width * j + i] /= 4.0;
}
}
다른 가능성은 (위의 매트릭스 기반의 매트릭스 대신) 임의의 지터를 수행하는 것이지만 곧 신호 처리 영역으로 들어가면 좋은 노이즈 기능을 선택하는 방법을 알기 위해 많은 독서가 필요합니다.
아이디어는 동일하게 유지됩니다. 픽셀을 작은 정사각형 영역을 나타내는 것으로 간주하고 픽셀 중심을 통과하는 하나의 광선 만 촬영하는 대신 전체 픽셀 영역을 덮는 많은 광선을 촬영하십시오. 광선 분포가 밀도가 높을수록 더 나은 신호를 얻을 수 있습니다.
추신 : 나는 위의 코드를 즉석에서 작성 했으므로 약간의 오류가 예상됩니다. 기본 아이디어 만 보여주기위한 것입니다.