2016-08-02 6 views
3

나는 전통적인 Whitted 광선 추적에서 작업 중이며 마치 평면이 아닌 볼록한 것처럼 삼각형의 표면을 보간하려고합니다. 일단 히트 포인트 p의 중점 좌표 (u,v)이 알려지면 삼각형을 파라 메트릭 서페이스 s(u,v)으로 처리하는 것이 좋습니다. 이 표면 방정식은 삼각형의 위치 p0, p1, p2과 법선 n0, n1, n2을 사용하여 계산해야합니다. 히트 포인트 자체가광선 추적을위한 3 개의 위치와 법선을 사용하여 삼각형 표면을 보간하는 가장 좋은 방법

p = (1-u-v)*p0 + u*p1 + v*p2; 

로 계산 지금까지 세 가지 솔루션을 발견했다.

해결 방법 1. 프로젝션 내가 온

첫 번째 솔루션입니다. 해당 각 법선에 수직 인 정점 p0, p1, p2을 통과하는 평면에서 히트 포인트를 투영 한 다음 결과를 보간하는 것입니다.

vec3 r0 = p0 + dot(p0 - p, n0) * n0; 
vec3 r1 = p1 + dot(p1 - p, n1) * n1; 
vec3 r2 = p2 + dot(p2 - p, n2) * n2; 
p = (1-u-v)*r0 + u*r1 + v*r2; 

해결책 2 곡률

"표면 간단한 로컬 보간 법선 벡터를 이용하여"높은 사다의 논문에서 제안하고 질문 "법선 벡터를 이용하여 표면의 로컬 보간법"에서 논의되지만 당신이 모든 필요한 계수를 사전 계산하지 않는 한, 실시간 광선 추적을 위해 너무 복잡하고 복잡하지 않은 것처럼 보입니다. 여기서 삼각형은 두 번째 순서의 표면으로 취급됩니다.

솔루션 3. 베 지어 곡선

이 솔루션은 브렛 헤일의 대답에 의해 영감을받은 것입니다. 그것은 내 경우에 더 높은 차수의 3 차원 베 지어 곡선의 보간법을 사용합니다. 예컨대, 에지에 대한 p0p1 베 지어 곡선 adj 일부 조정 파라미터이다

B(t) = (1-t)^3*p0 + 3(1-t)^2*t*(p0+n0*adj) + 3*(1-t)*t^2*(p1+n1*adj) + t^3*p1, 

같을 것이다. 하나의 세 모서리 보간 수 대안

float u1 = 1 - u; 
float v1 = 1 - v; 
vec3 b1 = u1*u1*(3-2*u1)*p0 + u*u*(3-2*u)*p1 + 3*u*u1*(u1*n0 + u*n1)*adj; 
vec3 b2 = v1*v1*(3-2*v1)*p0 + v*v*(3-2*v)*p2 + 3*v*v1*(v1*n0 + v*n2)*adj; 
float w = abs(u-v) < 0.0001 ? 0.5 : (1 + (u-v)/(u+v)) * 0.5; 
p = (1-w)*b1 + w*b2; 

:

float u1 = 1.0 - u; 
float v1 = 1.0 - v; 
float w = abs(u-v) < 0.0001 ? 0.5 : (1 + (u-v)/(u+v)) * 0.5; 
float w1 = 1.0 - w; 
vec3 b1 = u1*u1*(3-2*u1)*p0 + u*u*(3-2*u)*p1 + 3*u*u1*(u1*n0 + u*n1)*adj; 
vec3 b2 = v1*v1*(3-2*v1)*p0 + v*v*(3-2*v)*p2 + 3*v*v1*(v1*n0 + v*n2)*adj; 
vec3 b0 = w1*w1*(3-2*w1)*p1 + w*w*(3-2*w)*p2 + 3*w*w1*(w1*n1 + w*n2)*adj; 
p = (1-u-v)*b0 + u*b1 + v*b2; 

어쩌면 I 위 코드에서 무언가 엉망 가장자리 p0p1p0p2 그들을 보간

컴퓨팅 베 지어 곡선은 최종 코드를 준다 이 옵션은 셰이더 내부에서 매우 강건하지는 않습니다.

P. 낮은 폴리 모델에서 그림자 광선을 캐스팅 할 때 섀도우 광선의 정확한 시작점을 얻으려고합니다. Here 테스트 장면에서 결과 이미지를 찾을 수 있습니다. 큰 흰색 숫자는 해의 수를 나타냅니다 (원본 이미지의 경우 0).

P.P.S. 더 나은 결과를 줄 수있는 또 다른 효율적인 솔루션이 있는지 궁금합니다.

+0

약간의 조사가 끝난 후, Patrik H가 대신에 더 자세한 모델 (필요할 경우 솔루션 1과 함께)을 사용하는 장면을 사용하기로 결정했습니다. –

+0

나는 그 방법들로부터, 첫 번째 것이 효과가 있다는 것을 확인할 수있다. 다른 사람들은 예상 된 결과를 산출하지 못합니다. 또한 PN 테셀레이션을 구현하여 1과 비슷한 결과를 얻을 수 있지만 훨씬 더 큰 비용으로 제공합니다. 대부분의 렌더러는 거대한 그림자 바이어스를 사용하여 이것을 처리하는 것으로 보이지만 빛 누출을 유발할 수 있습니다. 그래서 완벽한 해결책이 없다는 결론을 내릴 수 있습니다. 비록 문제가 세분화와 부드러운 조명으로는 잘 보이지 않지만 여전히 확장 될 수 있습니다. – jj99

답변

1

삼각형을 '평평하게'유지하면 많은 이익을 얻고 렌더링하는 동안 필요한 여러 단계를 단순화합니다. 다른 한편으로는 고차원 표면을 근사하면 추적 오버 헤드가 상당히 발생하고 BVH 구조를 조정해야합니다.

지오메트리가 패싯 모음으로 처리되는 경우 음영 정보를 보간하여 부드럽게 음영 처리 할 수 ​​있지만 여전히 처리가 매우 효율적입니다.

한계 표면을 근사하는 적응 형 테셀레이션 기법이 있습니다 (OpenSubdiv이 좋은 예입니다). Pixar's Photorealistic RenderMan에는 세분 표면을 사용하여 오랜 역사가 있습니다. 렌더링 알고리즘을 경로 추적으로 전환했을 때, 서브 디비전 서페이스에 대한 프리 테셀레이션 단계도 도입했습니다. 이 단계는 렌더링이 시작되기 직전에 실행되며 한계 표면의 적응 형 삼각 측량 근사를 만듭니다. 이것은 추적하는 것이 더 효율적이며 적은 자원을 사용하는 경향이 있으며 특히이 업계에서 사용되는 고품질 자산의 경우에 그러합니다.

귀하의 질문에 답변하십시오. 저는 여러분이 한 일을 성취하는 가장 효율적인 방법은 고차원 표면에 대해 추적하는 대신에 삼각형을 뱉어내는 적응 형 세분법을 사용하는 것이라고 생각합니다.

+0

삼각형을 평평하게 유지하고 실제 형상을 변경하고 싶지는 않습니다. 이 보간법은 구와 같은 간단한 저 폴리 모델의 그림자 광선의 원점을 계산할 때만 필요합니다. 이 기능이 없으면 모델의 그림자가 계단처럼 보입니다. 기본 요소의 모양이 다시 만들어지기 때문입니다. –

+0

당신이 체력을 변경하면 당신의 삼각형은 더 이상 평평하지 않습니다. 예, 대부분의 렌더러, 특히 작은 광원 (그림자)의 그림자 종결 자에있는 일반적인 문제입니다. 일반적으로 형상의 테셀레이션은 문제가 없어 질 때까지 증가합니다. 빛으로 되돌아 가기 전에 광선 엡실론 (그림자 바이어스)을 조정 해보십시오. 아마도 삼각형 가장자리를 가로 지르는 전환을 부드럽게하는 데 도움이됩니다. –

+0

두 개의 이미지를이 질문에 연결했습니다. 광선 엡실론을 조정하는 것이 도움이 될 수 있다고 생각하지 마십시오. 삼각형 위에 약간 동일한 평면이 생기기 때문입니다. 폴리곤이 더 많은 모델을 사용하면 도움이 될 수 있습니다. 어쨌든 고마워. –

0

Dan Sunday는 광선 평면 교차가 계산 된 후 삼각형의 중심 좌표를 계산하는 algorithm을 설명합니다. n(s, t)는 일반적으로 표준화되지 않습니다하지만도 (nu, nv, nw)를하는 경우, 당신은 다음 정상뿐만 아니라 교차점을 보간하는, 말, n(s, t) = nu * s + nv * t + nw * (1 - s - t)을 사용할 수 있습니다
(s >= 0) && (t >= 0) && (s + t <= 1)

: 요점은 경우 삼각형의 내부에있다 아르. 더 높은 차수 보간이 필요할 수도 있습니다. PN-triangles은 수학적 정확성보다는 시각적 호소력면에서 비슷한 해킹이었습니다. 예를 들어, 실제 이차원 베 지어 삼각형은 원뿔 곡선을 나타낼 수 있습니다.

+0

PN 삼각형은 항상 추가 형상 테셀레이션이 필요합니까? 다른 옵션에 대해서, 지금 베 지어 보간을 시도했습니다. 꽤 다른 결과를 주지만 쉐이더 내부에서는 강건하지는 않습니다. 필자의 경우 프로젝션을 사용한 첫 번째 접근 방식이 더 효과적입니다. –