이번 글에서는 Vulkan 기반 엔진에 Ray Tracing Reflection을 처음으로 적용한 과정을 기록해둡니다.
아직 보완할 점이 많지만, 초기 결과와 구조를 아카이브 차원에서 남겨두고자 합니다.
기본적인 ray tracing 파이프라인을 설정하고,
G-buffer의 정보를 기반으로 반사 레이를 쏴서 반사색을 수집하는 구조입니다.
테스트 환경
테스트 씬: Sponza + Knight
RT Reflection ON: 10초간 1584 프레임 → 평균 FPS: 159.19
RT Reflection OFF: 평균 FPS 약 280
아직 벤치마크 기준이 정해지지 않았고
reflection도 아직 제대로 된 것이 아니기때문에
참고용으로만 남기고
곧 비교할 수 있게 준비를 갖추겠습니다.
[RTReflection.rgen]
vec3 viewDir = normalize(worldPos - camera.camPos);
vec3 reflectDir = reflect(viewDir, normal);
traceRayEXT(..., worldPos, 0.05, reflectDir, 10000.0, ...);
G-buffer로부터 world position, normal을 가져와 reflect() 방향을 계산하고
traceRayEXT()로 반사 레이를 쏩니다.
[RTReflection.rchit]
uvec3 idx = indices.i[gl_PrimitiveID];
Vertex v0 = vertices.v[idx.x];
Vertex v1 = vertices.v[idx.y];
Vertex v2 = vertices.v[idx.z];
float u = attribs.x;
float v = attribs.y;
float w = 1.0 - u - v;
vec2 uv = v0.texCoord * w + v1.texCoord * u + v2.texCoord * v;
Material mat = materials[inst.materialIndex];
if (mat.albedoTexIndex == -1) {
payload = mat.baseColor;
} else {
payload = texture(textures[nonuniformEXT(mat.albedoTexIndex)], uv);
}
히트된 삼각형의 UV를 통해 텍스처 색상을 조회하거나 기본 색상을 payload로 설정합니다.
이후 계산된 image를 lightpass에서
if (renderOptions.useRTReflection == 1) {
vec3 F0 = mix(vec3(0.04), albedo, metallic);
vec3 F = fresnelSchlick(max(dot(N, V), 0.0), F0);
finalColor += rtColor.rgb * F;
}
Fresnel 기반으로 반사 강도를 조절하며,
rtColor 값을 최종 색상에 더해줍니다.
현재 구현의 한계와 개선 과제
반사는 제대로 되지만 중간 중간 반사되지 않는 부분이 있습니다.
첫번째 반사된 부분의 albedo값만 가져와서 생기는 문제인 것 같습니다.
최소 2번까지는 레이를 튕겨 값을 저장할 예정입니다.
그리고 현재 반사되는 색을 계산할 때 (레이를 쏠 때)
그 표면의 재질을 무시하고 전부 정반사로 샘플링하고 있습니다.
이에 따른 어색함도 있는 것 같습니다. 이 부분도 수정이 필요합니다.
샘플링한 이미지입니다.
이것을 가지고 lightpass에서 최종 이미지를 계산하는데
샘플 수가 적어 noise가 많이 껴있습니다.
이 부분도 해결이 필요합니다.
또한 아직 skybox를 구현하지 않아서 miss된 부분의 색처리가 검은색 입니다.
skybox 도입 후 처리 할 예정입니다.
우선 reflection 품질을 우선 최대한 끌어올리고
해당 기준에서 퍼포먼스를 측정한 후 최적화를 진행할 예정입니다.
'Computer Graphics > Project' 카테고리의 다른 글
주차 정리 250410 ~ 250415 (0) | 2025.04.15 |
---|---|
20250415 (0) | 2025.04.15 |
20250414 (0) | 2025.04.14 |
Vulkan에 Ray Tracing 도입 하기 (2) (1) | 2025.04.11 |
Vulkan에 Ray Tracing 도입 하기 (1) (0) | 2025.04.11 |