레이트 레이싱에서 앤티 앨리어싱은 어떻게 구현됩니까?


13

온라인으로 몇 가지 기사를 읽은 후 Ray Tracing을 사용할 때 앤티 앨리어싱이 어떻게 작동하는지대한 단서가 없다고 확신 할 수 있습니다 .

내가 이해하는 것은 단일 픽셀 / 광선이 1이 아닌 4 개의 하위 픽셀과 4 개의 광선으로 나뉘어져 있다는 것 입니다.

누군가 이것이 어떻게 수행되는지 설명해 줄 수 있습니까 (바람직하게는 코드로)?



2
또한 PBRT pbrt.org/chapters/pbrt_chapter7.pdf 의이 장을 읽고이 논문 lgdv.cs.fau.de/get/785(pbrt 에서 구현 된 것과 다른 기술을 설명 함)를 읽는 것이 좋습니다 .
Tom van Bussel

1
foreach pixel : p{acc = 0; foreach subsample : s { acc+=sample_scene(s);} store(p, acc);}
ratchet freak

답변:


12

레이트 레이싱에서 AA를 수행하는 두 가지 방법이 있다고 말하는 것이 안전하다고 생각합니다.

1 : 최종 이미지와 깊이 이미지가있는 경우 게임에 사용되는 거의 모든 기존 기술 (FXAA 등)을 적용 할 수 있습니다. 최종 이미지에서 직접 작동하며 레이트 레이싱과 관련이 없습니다.

2 : 두 번째 방법은 각 픽셀에 대해 여러 개의 광선을 고려한 다음 결과를 평균화하는 것입니다. 매우 간단한 버전의 경우 다음과 같이 생각하십시오.

  • 먼저 1024x1024 크기의 이미지, 각 픽셀 당 한 개의 광선을 렌더링합니다 (예 :)
  • 렌더링 후에는 이미지를 512x512 (각각 4 픽셀이 평균화 됨)로 조정되며 가장자리가 더 매끄럽다는 것을 알 수 있습니다. 이 방법으로 512x512 크기의 최종 이미지에서 각 픽셀에 대해 4 개의 광선을 효과적으로 사용했습니다.

이 방법에는 다른 변형이 있습니다. 예를 들어, 지오메트리의 가장자리에있는 픽셀의 샘플 수를 조정할 수 있습니다. 즉, 일부 픽셀에는 4 개의 샘플 만 있고 다른 샘플에는 16이 있습니다.

위의 의견에서 링크를 확인하십시오.


기본적으로 이미지를 큰 크기로 렌더링하고 이미지로 저장할 때 더 작은 크기로 축소합니까? 꽤 간단 해 보입니다 :)! 이것이 슈퍼 샘플링 방법입니까?
Arjan Singh

1
그것의 예 싱 @Arjan en.wikipedia.org/wiki/Supersampling , 그러나 이것은 그들 모두의 가장 느린가, 레이트 레이싱은 쉽게 더 많이 수행 할 수있는 적응 형 수퍼 수행 할 수있다
Raxvan

14

Raxvan은 "전통적인"앤티 앨리어싱 기술이 앤티 앨리어싱을위한 심도 등의 정보를 사용하는 기술을 포함하여 레이트 레이싱에서 작동 할 것을 전적으로 맞습니다. 예를 들어 광선 추적에서 일시적인 안티 앨리어싱을 수행 할 수도 있습니다.

Julien은 수퍼 샘플링에 대한 설명 인 Raxvan의 두 번째 항목을 확장했으며 실제로 어떻게 수행했는지 보여주었습니다. 또한 픽셀 내에서 샘플의 위치를 ​​무작위로 지정할 수는 있지만 신호 처리 국가에 많이 들어갑니다. 더 깊은, 그리고 그것은 확실히이다!

NN

그렇게해도 여전히 앨리어싱을 얻을 수 있습니다. 샘플링 속도를 높이기 때문에 그렇지 않은 것보다 낫습니다. 따라서 더 높은 주파수 데이터 (더 작은 세부 사항)를 처리 할 수 ​​있지만 여전히 앨리어싱이 발생할 수 있습니다.

N

rand () 또는 std :: uniform_int_distribution에서 얻을 수있는 것처럼 "정규"난수 만 사용하는 경우 백색광이 다른 모든 색상 (주파수)으로 구성되는 방식과 같이 모든 주파수를 포함하므로 "백색 잡음"이라고합니다. ) 빛의.

화이트 노이즈를 사용하여 픽셀 내에서 샘플을 무작위로 추출하면 때때로 샘플이 서로 뭉치 게됩니다. 예를 들어 한 픽셀에서 평균 100 개의 샘플을 얻었지만 모두 픽셀의 왼쪽 상단에 있으면 픽셀의 다른 부분에 대한 정보를 얻지 못하므로 최종 결과 픽셀 색상 색상에 대한 정보가 누락됩니다.

더 나은 방법은 고주파 성분 만 포함하는 청색 노이즈라는 것을 사용하는 것입니다 (예 : 청색광이 고주파 광인 방법).

블루 노이즈의 이점은 균일 한 샘플링 그리드를 사용하는 것처럼 픽셀을 커버 할 수 있다는 점입니다. 그러나 여전히 임의성을 가지므로 앨리어싱을 노이즈로 바꾸고 더 나은 이미지를 얻을 수 있습니다.

불행히도, 블루 노이즈는 계산하는 데 비용이 많이들 수 있으며 최상의 방법은 모두 특허 된 것 같습니다 (무엇입니까?!).하지만 픽사에 의해 발명 된 한 가지 방법 (특허가 너무 많지만 100 % 확실하지는 않습니다) 샘플 포인트의 균일 한 그리드를 만든 다음 샘플링 그리드의 너비와 높이의 플러스 또는 마이너스 절반 사이의 임의의 양과 같이 각 샘플 포인트를 소량 씩 임의로 오프셋합니다. 이런 식으로 당신은 꽤 저렴한 블루 노이즈 샘플링을 얻을 수 있습니다.

이것은 계층화 된 샘플링의 한 형태이며, 포아송 디스크 샘플링 역시 그와 같은 형태이며 블루 노이즈를 발생시키는 방법이기도합니다. https://www.jasondavies.com/poisson-disc/

더 깊이 들어가고 싶다면이 질문과 답변을 확인하십시오!

픽셀 내에서 여러 개의 랜덤 샘플을 사용하는 앤티 앨리어싱에 대한 근본적인 이유는 무엇입니까?

마지막으로,이 재료는 사실적인 레이트 레이싱을 수행하는 일반적인 방법 인 몬테 카를로 경로 추적 영역으로 빠져 나가기 시작했습니다. 그것에 대해 더 배우고 싶다면 이것에 대해 읽어보십시오!

http://blog.demofox.org/2016/09/21/path-tracing-getting-started-with-diffuse-and-emissive/


당신의 이름을 보자 마자, 나는 당신이 파란 소음에 무언가를 포함시킬 줄 알았습니다 :)
Hubble

이것이 다시 활성화 된 것으로 나타났기 때문에 : 이것이 왜 그런지를 설명하기 위해 – 청색 잡음 샘플링 패턴은 저주파수에 집중된 대부분의 에너지와 기능을 통합하는 데 탁월합니다. 따라서 파란색 노이즈 패턴을 사용하면 신호가 대부분 저주파수에 의해 매끄 럽거나 지배적이라고 효과적으로 가정 할 수 있습니다. 고주파 신호의 경우 실제로는 비생산적 일 수 있습니다. 다행히도 자연 이미지는 저주파에 에너지가 집중되어 있습니다. 자세한 내용은 다음을 참조하십시오 : sampling.mpi-inf.mpg.de/2019-singh-fourier.html
lightxbulb

7

상당히 전형적인 레이트 레이싱 메인 루프를 가정 해 봅시다 :

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;
    }
}

다른 가능성은 (위의 매트릭스 기반의 매트릭스 대신) 임의의 지터를 수행하는 것이지만 곧 신호 처리 영역으로 들어가면 좋은 노이즈 기능을 선택하는 방법을 알기 위해 많은 독서가 필요합니다.

아이디어는 동일하게 유지됩니다. 픽셀을 작은 정사각형 영역을 나타내는 것으로 간주하고 픽셀 중심을 통과하는 하나의 광선 만 촬영하는 대신 전체 픽셀 영역을 덮는 많은 광선을 촬영하십시오. 광선 분포가 밀도가 높을수록 더 나은 신호를 얻을 수 있습니다.

추신 : 나는 위의 코드를 즉석에서 작성 했으므로 약간의 오류가 예상됩니다. 기본 아이디어 만 보여주기위한 것입니다.


좋은 답변입니다! @Raxvan이 사용하는 방법이 아닌이 방법을 사용하면 어떤 이점이 있습니까? 큰 크기로 렌더링 한 다음 더 작은 크기로 축소하여 동일한 결과를 얻을 수 있습니까?
Arjan Singh

기본적으로 레이트 레이싱을 사용하면 더 큰 이미지를 렌더링 한 다음 축소 할 필요가 없습니다. 즉, 유연성이 훨씬 높아집니다. 많은 샘플을 보유 할 수 있고, 지역에 따라 샘플 수를 다양하게 변경할 수 있으며, 단순히 스케일 조정 단계를 추가 할 필요가 없습니다.
Julien Guertault

2
지 터링 주제에서 이것은 상당히 복잡한 주제로 판명되었습니다. 다음은 수년 전의 최첨단 그래픽을
Mikkel Gjoel

위의 코드 샘플은 4 샘플 MSAA를 사용합니다 .8x MSAA를 수행하려면 매트릭스는 어떻게됩니까? 위에 표시된 지터 매트릭스에서 무엇을 변경해야합니까?
Arjan Singh

"4 가지 샘플 MSAA는 다음과 같습니다." 비용 / 품질 트레이드 오프로 래스터 화에 사용 된 MSAA는 먼저 각 샘플이 적중하는 개체 (삼각형 읽기)를 결정합니다. 모두 동일한 객체에 도달하면 하나의 음영 처리 작업 만 수행됩니다. 2 개의 서로 다른 객체가 발견되면 2 개의 쉐이딩 작업이 수행되고 결과는 각 객체에 치는 샘플 수 등으로 가중치부여 되고 합산됩니다. 설명하는 것은 표준 수퍼 샘플링 AA, 즉 SSAA입니다.
시몬 F

1

위의 답변에 추가하십시오.

분산 레이 트레이싱 (쿡, 포터 및 카펜터). 공간 AA, 시간 AA (예 : 모션 블러) 및 초점 / 피사계 심도를 동시에 수행 할 수 있습니다. 논문을 읽는 것이 가장 좋지만, 기본적으로 픽셀 당 발사하는 N- 레이는 의사 난수 시간 (모션 블러의 경우)과 렌즈의 위치 (포커스 효과를 얻기 위해)를 지정할 수 있습니다.

적응 형 수퍼 샘플링 : 처음에는 픽셀 당 특정 수의 광선을 발생시킵니다. 그러나 로컬 이웃의 광선이 크게 다른 결과를 반환 하면 샘플링 속도 (예 : 2 배)를 로컬로 증가시켜 결과를 개선 할 수 있습니다. 프로세스를 반복하도록 선택할 수 있습니다. 객체가 여전히 '샘플 사이에 떨어질'수 있기 때문에 완벽하지는 않지만 더 높은 속도로 균일하게 샘플링하는 것보다 저렴할 수 있습니다.

원뿔을 이용한 광선 추적 (Amanatides) : 무한한 얇은 광선을 사용하는 대신, 각 광선은 원뿔에 의해 근사됩니다 (예 : 모든 픽셀 (및 이웃)을 덮는 직경으로 부분 적용 범위를 평가할 수 있음) . 또한 텍스처 샘플링 / 앤티 앨리어싱, 부드러운 그림자 및 잠재적 인 LOD 모델에도 이점이 있습니다. 년 전에 구현을 했으므로 확실히하기가 어렵지만 많은 추가 광선을 피하십시오. IIRC는 또한 연필 추적이라는 계획이 있었지만 (초기 검색에서 논문에 대한 링크를 찾지 못했습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.