[Vulkan ray traacing] 샘플 코드의 다음 그림자와 투과에 관하여

개요


ray tracking의 API에서 그림자와 투사(예를 들어 유리 등 대상)는 상대적으로 간단하게 실현할 수 있다.

샘플 코드


NVIDIA Vulkan Ray Tracing Tutorial
글의 마지막 부분에는 shadow에 대한 기술이 있다.
https://nvpro-samples.github.io/vk_raytracing_tutorial_KHR/

traceRayEXT 함수


raygen 면도기, 미스 면도기, rchiit 면도기에 사용되는 초편의 함수.origin에서direction방향으로ray를 건너뛰고,hit가 대상에 도착하면 지정한 rchiit면도기를 실행하고, 명중하지 않으면 지정한miss면도기를 실행합니다.
traceRayEXT 함수를 처음 본 것은 raygen ther일 것입니다. 그러나 이 함수는 처음처럼 다른 마스크에서 실행할 수 있습니다.
이 함수를 사용하여 그림자와 투사를 확인합니다.

실시 예


투명한 입방체와 색깔이 있는 평면을 그려 왼쪽 상단에서 빛을 비추는 그림.

그림자


이 아이디어는 평면의 각 점에서light로traceRayEXT 함수를 실행하고 대상에 부딪히면 그늘이 확실하다는 것이 매우 간단하다.

rayhit.rchit
if(objId == 0 && dot(normal, L) > 0)
{
  float tMin = 0.001;
  float tMax = lightDistance;
  vec3 origin = worldPos;
  vec3 rayDir = L;
  uint flags = gl_RayFlagsTerminateOnFirstHitEXT | gl_RayFlagsOpaqueEXT 
                  | gl_RayFlagsSkipClosestHitShaderEXT;
  isShadowed = true;
  traceRayEXT(topLevelAS, flags, 0xFF, 0, 0, 1, origin, tMin, rayDir, tMax, 1);
  if(isShadowed)
  {
    attenuation = 0.3;
  }
}
shadow.rmiss
void main()
{
  isShadowed = false;
}
traceRayEXT () 를 실행하지만, 여기의 목적은 ray가miss인지 아닌지입니다.미리 isShadowed 변수에 진짜를 넣고'miss Shadowed = ray라고 불리는 것은 적합하지 않다'는 경우 miss Shadowd에서 isShadowd를 가짜로 바꾸어 호출 원본의 점이 그림자인지 판단한다.

투명도 정보


상술한 링크의 샘플 코드에는 적혀 있지 않지만 생각은 같다.
rayhit.rchit
if(alpha < 1.0)
{
  float tMin = 0.01;
  float tMax = 100.0;
  pldBlend.pos = worldPos;
  pldBlend.hit = false;
  pldBlend.color = pushC.clearColor.xyz;
  vec4 cameraPos = cam.viewInverse * vec4(0, 0, 0, 1);
  vec3 direction = normalize(worldPos - cameraPos.xyz);
  uint flags = gl_RayFlagsOpaqueEXT;
  for(uint i = 0; i < 4; i++)
  {
    traceRayEXT(topLevelAS, flags, 0xFF, 1, 0, 2, pldBlend.pos, tMin, direction, tMax, 2); 
    if(pldBlend.hit)
      break;
  }
  color = mix(pldBlend.color, color, alpha);
}
판단도 objId일 수 있지만 rchi를 호출한 점(worldPos)을 유리 입방체에서 처리한다.WorldPos를 origin, direction을 camera에서 보는 WorldPos 방향으로 설정합니다.초기 색상을 배경색으로 하고 이 방향으로traceRayEXT 함수를 여러 번 실행하며 평면hit에 배치하면 해당 위치의 색상을 가져옵니다.주의점으로서origin은 매번 부를 때마다 다음hit점의 좌표를 붙여야 한다.
마지막으로 믹스 함수를 통해 가져온 색과 유리 입방체의 색을blend로 합니다.

최후


ray tracking에서 렌더링 방법은 전통적인rastrizer형 파이프와 다른 것 같습니다.이전의 파이프라인은 각 정점에 따라 동작을 기술했기 때문에 다른 정점에 맞추어 이런 기술을 하는 것은 매우 어려웠다. 예를 들어 음영도 등은 공을 들여야 했다.한편, 레이 트랙팅은 레이의 경치를 뛰어넘을 수 있다는 사상을 묘사하기 때문에 이러한 그림자와 투과에 대한 코드의 기술은 간단해졌다.

좋은 웹페이지 즐겨찾기