나는 전통적인 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 위 코드에서 무언가 엉망 가장자리
p0p1
및
p0p2
그들을 보간
컴퓨팅 베 지어 곡선은 최종 코드를 준다 이 옵션은 셰이더 내부에서 매우 강건하지는 않습니다.
P. 낮은 폴리 모델에서 그림자 광선을 캐스팅 할 때 섀도우 광선의 정확한 시작점을 얻으려고합니다. Here 테스트 장면에서 결과 이미지를 찾을 수 있습니다. 큰 흰색 숫자는 해의 수를 나타냅니다 (원본 이미지의 경우 0).
P.P.S. 더 나은 결과를 줄 수있는 또 다른 효율적인 솔루션이 있는지 궁금합니다.
약간의 조사가 끝난 후, Patrik H가 대신에 더 자세한 모델 (필요할 경우 솔루션 1과 함께)을 사용하는 장면을 사용하기로 결정했습니다. –
나는 그 방법들로부터, 첫 번째 것이 효과가 있다는 것을 확인할 수있다. 다른 사람들은 예상 된 결과를 산출하지 못합니다. 또한 PN 테셀레이션을 구현하여 1과 비슷한 결과를 얻을 수 있지만 훨씬 더 큰 비용으로 제공합니다. 대부분의 렌더러는 거대한 그림자 바이어스를 사용하여 이것을 처리하는 것으로 보이지만 빛 누출을 유발할 수 있습니다. 그래서 완벽한 해결책이 없다는 결론을 내릴 수 있습니다. 비록 문제가 세분화와 부드러운 조명으로는 잘 보이지 않지만 여전히 확장 될 수 있습니다. – jj99