SlideShare a Scribd company logo
1 of 70
Screen
Space
Reflection
Screen Space Reflection?
Screen Space Reflection
: 화면 : 공간 : 반사
Reflection?
사람은 반사된 빛을 통해서 사물을 봅니다.
Reflection?
그런데 눈으로 반사된 빛은 광원에서 나온 빛 뿐만이 아니라 다른 물체에서 반사된
빛일 수 있습니다.
Reflection?
거울에서 이런 현상을 가장 잘 관찰할 수 있습니다.
Reflection?
거울 뿐만 아니라 다양한 사물에서도 관찰할 수 있습니다.
Reflection?
3D 애플리케이션에서 이런 반사를 어떻게 표현할 수 있을까요?
다음과 같은 임의의 평면에 놓인 하나의 거울을 생각해 봅시다.
거울
거울 앞에
놓인 사물
Reflection?
거울과 같은 매끄러운 표면에 들어온 빛은 표면의 법선 방향에 대해서 입사각과 동일
한 각도로 반사됩니다.
거울
거울 앞에
놓인 사물
Reflection?
그 결과 거울 평면을 대칭으로 사물의 상이 맺히게 됩니다.
3D 애플리케이션에서 장면에 거울이 하나만 있다면 거울에 맺히는 상의 위치로 사물
을 이동하여 한번 더 그리면 됩니다.
거울
거울 앞에
놓인 사물
거울에
맺힌 상
Reflection?
즉 거울 이동 행렬을 장면의 모든 물체에 적용하여 한번씩 더 렌더링하면 됩니다.
다만 거울은 앞뒤가 반전되므로 카메라를 기준으로 뒷면인 면이 거울의 상으로 그려
질 수 있습니다. 따라서 winding order를 고려해야 합니다.
거울
거울 앞에
놓인 사물
거울에
맺힌 상
Reflection?
이제 3D 애플리케이션에서 거울에 반사된 상을 표현할 수 있습니다.
그럼 한 장면에 거울이 여러 개라면 어떻게 하면 될까요?
=> 거울의 개수 만큼 반사 행렬을 만들어 물체를 여러 번 그리면 됩니다.
즉 반사 행렬을 사용한 방식은 장면의 물체 개수 X 거울의 개수 만큼 더 렌더링을 더
해야 합니다.
거울의 개수에 따라 Draw call이 증가하게 됩니다.
Reflection?
그리고 이런 물체는 표현할 수 있을 까요?
출처 : https://en.wikipedia.org/wiki/Specular_reflection
Reflection?
반사 행렬을 사용한 방식은 상이 맺히는 위치에 물체를 여러 번 그립니다.
구와 같이 여러 평면이 존재하는 기하 구조는 물체를 여러 번 겹쳐 그려야 합니다.
Environment Mapping
이 경우 환경 매핑을 사용할 수 있습니다.
물체를 기준으로 주변의 환경을 렌더링하고 이 정보를 바탕으로 반사된 상을 계산하
는 것입니다.
구글 스트리트 뷰와 같은 파노라마 사진을 생각하면 됩니다.
출처 : https://www.google.co.kr/intl/ko/streetview/apps/
Environment Mapping
주변 환경은 다양한 형식의 텍스처로 사전에 저장할 수 있고 latitude/longitude,
mirrored ball, horizontal cross 등의 형식으로 저장될 수 있습니다.
출처 : http://spiralgraphics.biz/genetica/help/index.htm?environment_maps_explained.htm
Environment Mapping
그 중에서도 정육면체 형태의 Cube 텍스처를 주로 사용하는데 간단한 셰이더 코드
로 손쉽게 환경 매핑을 구현할 수 있습니다.
물
체
Cube 텍스처
관찰 시점
TextureCube cubeTex : register( t0 );
float4 main( PS_INPUT input ) : SV_Target
{
return cubeTex.Sample( baseSampler, 반사 벡터);
}
Environment Mapping
반사 벡터를 통해 Cube 텍스처를 샘플링하면 다음과 같이 반사도가 높은 표면을 3D
애플리케이션에서 표현할 수 있게 됩니다.
출처 : https://learnopengl.com/Advanced-OpenGL/Cubemaps
Environment Mapping
환경 매핑은 물체에 거울과 같은 높은 반사도를 가지는 다양한 표면이 있을 경우에
유용하게 사용될 수 있습니다.
하지만 애플리케이션내에서 실시간으로 움직이는 물체를 표현하기 위해서는 반사
행렬을 사용 했던 것처럼 주변 환경을 매번 다시 그려줘야 합니다.
Cube 텍스처를 사용할 경우 6면의 텍스처 X 물체의 개수 만큼의 Draw Call이 추가
될 수 있습니다.
Environment Mapping
또 다음과 같은 문제가 발생할 수 있습니다.
출처 : http://www.cse.chalmers.se/edu/year/2017/course/TDA361/Advanced%20Computer%20Graphics/Screen-space%20reflections.pdf
Environment Mapping
이 문제는 주변 환경을 렌더링한 위치가 실제 반사가 일어나는 위치와 다르기 때문에
발생하는 현상입니다.
Cube 텍스처
관찰 시점
Cube 텍스처는 물체의 중앙에서 렌더링 됨
반사로 가져와야 할 텍셀 위치
하지만 렌더링한 위치를 기준으로 하면 이 텍셀이 선택됨
Environment Mapping
즉 환경 매핑은 물체에 반사되는 주변환경이 물체에서 무한한 거리만큼 떨어져
있을 경우에 적절한 효과를 제공합니다.
마지막으로 환경 매핑은 자기 자신에 대한 반사를 표현하지 못합니다.
출처 : http://schorsch.efi.fh-nuernberg.de/roettger/index.php/Computergrafik/EnvironmentMapping
주전자의 주둥이 부분이 보이지 않음
Screen Space Reflection
반사 행렬을 사용하는 방법은 반사 행렬이 특정 표면에 제한되므로 다른 평면에 반사
되는 물체를 그리기 위해서는 행렬을 다시 구해서 물체를 중복으로 그려야 합니다.
환경 매핑은 실시간 반사를 위해서 여전히 물체를 다시 그려야 하고 반사되는 물체가
반사면에 근접해 있을 때는 괴리감이 발생할 수 있습니다.
이런 기존 기법들의 단점을 어느정도 보완한 기법이 바로 Screen Space
Reflection 입니다.
Screen Space Reflection
Screen Space Reflection의 핵심을 파악하기 위해서 다음 사진을 살펴보겠습니다.
수면에 건물이 깔끔하게 반사되어 보이는 사진입니다.
Screen Space Reflection
이 사진을 잘 살펴보면 수면에 반사하여 보이는 건물들을 사진에서 모두 찾을 수 있
다는 걸 알 수 있습니다.
Screen Space Reflection
즉 화면 공간(Screen Space)의 데이터를 통해서 반사를 계산할 수 있습니다.
이번 프레임에 그린 장면의 데이터를 재사용하면 반사를 위해서 물체를 여러 번
그리지 않아도 되므로 장면의 복잡도에 영향을 받지 않습니다.
또한 장면은 매프레임 갱신되야 하기 때문에 실시간 반사를 위한 추가 작업이
필요하지 않습니다.
자기 자신에 대한 반사도 가능하며 특정 표면에 제한되지 않습니다.
Screen Space Reflection
화면 공간의 데이터를 통해서 반사를 계산하려면 3가지 정보를 알고 있어야 합니다.
1. 장면의 색상 정보
2. 장면의 법선 정보
3. 장면의 위치 정보
Screen Space Reflection
Screen Space Reflection으로 아래와 같은 픽셀 위치의 반사를 계산해보겠습니다.
카메라에서 해당 픽셀 까지의 광선이 표면에 반사되어 어느 물체에 부딪히는지를
추적하면 됩니다.
이 평면이 반사도가 높은 재질
Screen Space Reflection
카메라 공간에서 카메라의 위치는 (0, 0, 0) 이므로 해당 픽셀로 광선이 진행하는
방향은 픽셀의 카메라 공간 위치가 됩니다.
이를 장면의 위치 정보를 이용하여 얻어 냅니다.
Screen Space Reflection
이제 해당 픽셀의 법선 벡터를 알면 반사 벡터를 구할 수 있습니다.
Screen Space Reflection
이제 반사 벡터의 방향으로 Ray Marching을 통해서 광선이 충돌하는 위치를 알아
내고 해당 위치의 텍셀을 가져오면 됩니다.
충돌하는 위치는 어떻게 알아 낼 수 있을까요?
Ray Marching?
광선과 어떤 표면의 충돌점을 비교적 쉽게 구할 수 있는 방법을 한번 살펴보겠습니다.
어떤 광선이 구에 충돌한다면 그 충돌점은 광선과 구를 함수로 표현한 다음 광선의
함수를 구의 함수에 대입하는 것으로 계산할 수 있습니다.
광선을 함수로 표현 : 𝑅 𝑡 = 𝑃 + 𝑡𝑑 𝑡 ≥ 0
구를 함수로 표현 : 𝑋 − 𝐶 ∙ 𝑋 − 𝐶 = 𝑟2
𝑃 + 𝑡𝑑 − C ∙ 𝑃 + 𝑡𝑑 − C = 𝑟2
𝑚 + 𝑡𝑑 ∙ 𝑚 + 𝑡𝑑 = 𝑟2
(𝑃 − 𝐶를 𝑚으로 치환)
𝑑 ∙ 𝑑 𝑡2 + 2 𝑚 ∙ 𝑑 𝑡 + (𝑚 ∙ 𝑚) = 𝑟2 (전개)
𝒕 𝟐
+ 𝟐 𝒎 ∙ 𝒅 𝒕 + 𝒎 ∙ 𝒎 − 𝒓 𝟐
= 𝟎 (𝒅 ∙ 𝒅 = 𝟏)
근의 공식을 통해서 𝒕 를 구할 수 있고 이를 광선의 함수에 대입하면 위치
Ray Marching?
이렇게 특정 표면을 함수로 표현할 수 있는 경우에는 충돌점을 비교적 쉽게 찾아
낼 수 있습니다.
하지만 이미 그려진 복잡한 장면의 표면은 함수로 표현하기 어렵습니다.
Ray Marching으로 표면 함수가 쉽게 풀리지 않을 경우에 표면과 광선의 충돌점을
찾아낼 수 있습니다.
Ray Marching?
다음과 같은 표면에서 Ray Marching을 사용하여 광선의 충돌점을 찾아보겠습니다.
Ray Origin
Ray Marching?
광선을 진행 방향으로 일정거리 만큼 진행합니다.
해당 위치가 표면과 충돌했는지 검사합니다. 이 단계에서는 충돌하지 않았습니다.
Ray Origin
Ray Marching?
표면과 충돌 할 때 까지 반복합니다.
이제 표면과 충돌하였습니다.
Ray Origin
Ray Marching?
알아낸 충돌위치에서 추가적으로 이진탐색을 수행하여 정확도를 높일 수 있습니다.
Ray Origin
이전 진행 길이의 절반 만큼을 반대로 이동
충돌했는지 여부에 따라 진행방향을 변경하고
진행 길이를 절반씩 줄여가며 이동
Ray Marching?
이런 식으로 행진하듯이 광선의 진행 방향으로 일정 거리만큼 이동시켜 가며 충돌점
을 찾아내는 방식을 Ray Marching이라고 합니다.
충돌점을 찾아내는 것 외에도 Ray Marching은 균일하지 않은 볼륨을 가진 투명한
물체를 그릴 때도 사용됩니다.
출처 : https://en.wikipedia.org/wiki/Volume_ray_casting
Screen Space Reflection
Using Ray Marching
Screen Space Reflection
Using Ray Marching
float4 main( PS_INPUT input ) : SV_TARGET
{
float3 incidentVec = normalize( input.viewPos );
float3 viewNormal = normalize( input.viewNormal );
float3 reflectVec = reflect( incidentVec, viewNormal );
reflectVec = normalize( reflectVec );
reflectVec *= g_rayStepScale;
float3 reflectPos = input.viewPos;
float thickness = g_maxThickness / g_FarPlaneDist;
[loop]
for ( int i = 0; i < g_maxRayStep; ++i )
{
float3 texCoord = GetTexCoordXYLinearDepthZ( reflectPos );
float srcdepth = depthbufferTex.SampleLevel( baseSampler, texCoord.xy, 0 ).x;
float depthDiff = texCoord.z - srcdepth;
if ( depthDiff > g_depthbias && depthDiff < thickness )
{
float4 reflectColor = BinarySearch( reflectVec, reflectPos );
float edgeFade = 1.f - pow( length( texCoord.xy - 0.5f ) * 2.f, 2.f );
reflectColor.a *= pow( 0.75f, (length( reflectPos - input.viewPos ) / g_maxRayLength) ) * edgeFade;
return reflectColor;
}
else
{
reflectPos += ( i + Noise( texCoord.xy ) ) * reflectVec;
}
}
return float4(0.f, 0.f, 0.f, 0.f);
}
반사 벡터 계산
Ray Marching
충돌점을 못 찾았을 때 광선을 진행
첫 충돌 후 이진 탐색
Screen Space Reflection
Using Ray Marching
Screen Space Reflection 은 다른 화면 공간 알고리즘 (대표적으로 SSAO)과
마찬가지로 해결할 수 없는 약점을 가지고 있는데 화면 공간 외의 기하정보를
알지 못합니다.
월드 공간상에 또 다른 물체가 이렇게
위치하고 있다면 해당 물체에 대한 정보를
얻을 수 없습니다.
또한 가려진 물체에 대한
정보도 얻을 수 없습니다.
Screen Space Reflection
Using Ray Marching
정보를 얻을 수 없는 경우에는 다음과 같은 아티팩트를 확인할 수 있습니다.
윈도우 밖에 있는 경우 물체에 가려진 경우
Screen Space Reflection
Using Ray Marching
이런 아티팩트로 인한 어색한 비주얼을 최소화하기 위해서 다음과 같은 처리를
합니다.
1. 윈도우 가장자리에 가까우면 Fade out 시킴
2. 일정 크기의 두께 값 혹은 두께를 저장한 텍스처를 사용
float edgeFade = 1.f - pow( length( texCoord.xy - 0.5f ) * 2.f, 2.f );
reflectColor.a *= pow( 0.75f, (length( reflectPos - input.viewPos ) / g_maxRayLength) ) * edgeFade;
return reflectColor;
float thickness = g_maxThickness / g_FarPlaneDist; // 일정 크기의 두께 값
// ...
if ( depthDiff > g_depthbias && depthDiff < thickness )
{
float4 reflectColor = BinarySearch( reflectVec, reflectPos );
// ...
}
Screen Space Reflection
Using Ray Marching
Ray Marching을 사용한 Screen Space Reflection 기법에서 마지막으로 광선의
진행 길이에 대해 살펴보도록 하겠습니다.
광선의 진행 길이는 고정 값을 사용하는 것이 아니라 사용자의 설정 값에 따라 변동
될 수 있습니다.
진행 길이를 늘리면 Ray Marching이 좀 더 빨리 끝나 성능상 이득을 얻을 수 있나
적절하지 않은 진행 길이를 설정하면 다음과 같은 아티팩트를 관찰 할 수 있습니다.
Screen Space Reflection
Using Ray Marching
Screen Space Reflection
Using Ray Marching
진행 길이가 너무 늘어나면 어떤 위치에서는 광선이 물체를 그냥 통과해버리게 되고
그 결과 반사된 상에 군데 군데 구멍이 생기게 됩니다.
광선의 진행 길이는 장면에 따라 신중하게 결정해야 하는데 이것이 쉽지 않습니다.
3차원 공간에서 Ray Marching은 원근법 때문에 어떤 픽셀은 과하게 샘플링 될 수
도 있고 어떤 픽셀은 덜 샘플링 될 수 있습니다.
출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html
과하게 샘플링 된 부분 같은 픽셀을
여러 번 샘플링 할 수록 붉은색
덜 샘플링 된 부분 광선 경로에 있는
몇몇 픽셀을 건너 뛰는 것이 관찰됨
화면 공간에서 본 3D Ray March
Screen Space Ray Tracing
3차원 공간의 Ray Marching의 문제를 해결하기 위해서 화면 공간에서 Ray
Marching을 수행합니다.
화면 공간에서의 Ray Marching은 선분 그리기 알고리즘인 DDA( Digital
Differential Analyzer ) 알고리즘을 사용합니다.
출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html
Digital Differential Analyzer
DDA 알고리즘은 다음과 같은 단계로 수행됩니다.
1. 그리고자 하는 선분의 기울기를 계산 (𝑚 =
𝑦 𝑒𝑛𝑑−𝑦 𝑠𝑡𝑎𝑟𝑡
𝑥 𝑒𝑛𝑑−𝑥 𝑠𝑡𝑎𝑟𝑡
)
2. 기울기가 양수이고 𝑚 ≤ 1 일 경우 x축 방향으로 1식 증가하면서 y값을 계산
𝑥 𝑘+1 = 𝑥 𝑘 + 1
𝑦 𝑘+1 = 𝑦 𝑘 + 𝑚
3. 1 < 𝑚 일 경우 y축 방향으로 1식 증가하면서 x값을 계산
𝑥 𝑘+1 = 𝑥 𝑘 +
1
𝑚
𝑦 𝑘+1 = 𝑦 𝑘 + 1
4. 기울기가 음수 일 경우에도 픽셀 위치를 계산하기 위해 유사한 계산이 이뤄짐
Digital Differential Analyzer
Screen Space Reflection
Using Digital Differential Analyzer
Screen Space Reflection
Using Digital Differential Analyzer
float4 main( PS_INPUT input ) : SV_TARGET
{
float3 incidentVec = normalize( input.viewPos );
float3 viewNormal = normalize( input.viewNormal );
float3 reflectVec = reflect( incidentVec, viewNormal );
reflectVec = normalize( reflectVec );
float3 hitPixel_alpha;
bool isHit = TraceScreenSpaceRay( reflectVec, input.viewPos, hitPixel_alpha );
float3 color = framebufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).rgb;
return float4( color, hitPixel_alpha.z ) * isHit;
}
반사 벡터 계산
충돌 여부 및 충돌한 픽셀 좌표를 계산
bool TraceScreenSpaceRay( float3 dir, float3 viewPos, out float3 hitPixel_alpha )
{
float rayLength = ( viewPos.z + dir.z * g_maxRayLength ) < g_nearPlaneDist ? ( g_nearPlaneDist - viewPos.z ) / dir.z : g_maxRayLength;
hitPixel_alpha = float3( -1, -1, 1 );
float3 rayEnd = viewPos + dir * rayLength;
float4 ssRayBegin = mul( float4( viewPos, 1.0 ), g_projectionMatrix );
float4 ssRayEnd = mul( float4( rayEnd, 1.0 ), g_projectionMatrix );
float k0 = 1 / ssRayBegin.w;
float k1 = 1 / ssRayEnd.w; 화면 공간으로 광선의 시작점, 끝점을 변환
Screen Space Reflection
Using Digital Differential Analyzer
float2 P0 = ssRayBegin.xy * k0;
float2 P1 = ssRayEnd.xy * k1;
P0 = ( P0 * 0.5 + 0.5 ) * g_targetSize;
P1 = ( P1 * 0.5 + 0.5 ) * g_targetSize;
P1 += ( dot( P1 - P0, P1 - P0 ) < 0.0001 ) ? float2( 0.01, 0.01 ) : float2( 0, 0 );
float2 delta = P1 - P0;
bool permute = false;
if ( abs( delta.x ) < abs( delta.y ) )
{
permute = true;
delta = delta.yx;
P0 = P0.yx;
P1 = P1.yx;
}
float stepDir = sign( delta.x );
float invdx = stepDir / delta.x;
float stepCount = 0;
float rayZ = viewPos.z;
float sceneZMax = viewPos.z + 100.f;
float end = stepDir * P1.x;
float3 Pk = float4( P0, k0 );
float3 dPk = float4( float2( stepDir, delta.y * invdx ), ( k1 - k0 ) * invdx );
dPk *= g_rayStepScale;
float thickness = g_maxThickness;
화면 공간으로 광선의 시작점, 끝점을 변환
기울기 계산 후 DDA delta 값을 계산
1 <
𝑦 𝑒𝑛𝑑 − 𝑦𝑠𝑡𝑎𝑟𝑡
𝑥 𝑒𝑛𝑑 − 𝑥 𝑠𝑡𝑎𝑟𝑡
= 𝑥 𝑒𝑛𝑑 − 𝑥 𝑠𝑡𝑎𝑟𝑡 < 𝑦 𝑒𝑛𝑑 − 𝑦𝑠𝑡𝑎𝑟𝑡
Screen Space Reflection
Using Digital Differential Analyzer
[loop]
for ( ;
( ( Pk.x * stepDir ) <= end ) &&
( stepCount < g_maxRayStep ) &&
( ( rayZ < sceneZMax ) ||
( ( rayZ - thickness ) > sceneZMax ) ) &&
( sceneZMax != 0.0 );
Pk += dPk,
stepCount += 1 )
{
hitPixel_alpha.xy = permute ? Pk.yx : Pk.xy;
hitPixel_alpha.xy *= g_invTargetSize;
hitPixel_alpha.y = 1 - hitPixel_alpha.y;
rayZ = 1 / Pk.w;
sceneZMax = depthbufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).x;
thickness = backfaceDepthBufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).x * g_FarPlaneDist;
sceneZMax *= g_FarPlaneDist;
thickness -= sceneZMax;
sceneZMax += g_depthbias;
}
float edgeFade = 1.f - pow( length( hitPixel_alpha.xy - 0.5 ) * 2.f, 3.0f );
hitPixel_alpha.z = edgeFade;
return ( rayZ >= sceneZMax ) && ( rayZ - thickness <= sceneZMax );
}
Ray Marching
// 광선이 끝까지 진행하기 전까지
// 최대 Ray Marching 단계에 도달하기 전까지
// 물체에 부딪히기 전까지
// 화면 공간에서 광선을 진행
Summary
기존 반사 표현 방식의 단점을 보완할 수 있는 대안 기술이라고 할 수 있습니다.
성능이 장면의 복잡도에 영향을 받지 않지만 비용이 낮다고는 할 수 없습니다.
2차원 텍스처로 기록된 장면 정보만을 사용하기 때문에 정보 부족으로 인한 다양한
문제가 발생 할 수 있습니다.
출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html
왼쪽부터 차례대로
1. 절두체 밖의 정보 X
2. 물체 뒷부분의 정보 X
3. 가려진 물체에 대한 정보 X
Future?
출처 : https://www.techpowerup.com/247365/dice-to-dial-back-ray-tracing-eye-candy-in-battlefield-v-to-favor-performance
Future?
2018년도 9월 20일에 출시한 GeForce RTX 20 시리즈에서 실시간 레이 트레이싱
기능을 지원합니다.
실시간 레이 트레이싱을 통해서 기존 기술들의 한계점에서 벗어나 반사 뿐만이 아니
라 굴절, 그림자도 계산할 수 있습니다.
다만 실시간 레이 트레이싱이 하드웨어에 종속적인 기술이고 가격대가 높게 책정되
어 있어 ( RTX 2070이 60만원 후반 ) 보편적으로 정착할 수 있을지 두고 볼 필요가
있습니다.
Screenshot
Screenshot
Screenshot
Reference
아이콘 출처 : https://www.flaticon.com/
구와 광선의 충돌 : Real-Time Collision Detection (Christer Ericson)
Screen Space Ray Tracing : http://casual-effects.blogspot.com/2014/08/screen-space-
ray-tracing.html
Battlefield V: Official GeForce RTX Real-Time Ray Tracing Demo :
https://youtu.be/WoQr0k2IA9A
그 밖에 좋은 사이트 들 :
http://www.kode80.com/blog/2015/03/11/screen-space-reflections-in-unity-5/
http://tips.hecomi.com/entry/2016/04/04/022550
Appendix
Reflection Matrix
거울에 맺히는 상의 위치를 찾기 위해서 임의의 평면 P를 생각해 보겠습니다.
P
Reflection Matrix
그리고 한 점 v가 다음과 같이 위치해 있다고 하겠습니다.
P
n
v
Reflection Matrix
임의의 평면 P를 기준으로 v가 대칭 이동한 위치를 구해야 합니다.
1. 점 v의 위치를 벡터로 취급하여 평면 P의 법선 벡터와 내적합니다. 그 결과로 n에
투영된 v의 길이를 알 수 있습니다.
P
n
v
v’
Reflection Matrix
2. 평면 P에 대해서 대칭 이동한 v의 위치는 이 길이(𝑣′ ∙ 𝑛) 의 2배 만큼의 거리를
법선 n의 반대 방향으로 이동한 위치가 됩니다.
P
n
v
v’
Reflection Matrix
수식으로 정리하자면
가 되고 이를 행렬로 표현하면 다음과 같습니다.
𝑣 − 2 ∗ 𝑣′ ∙ 𝑛 ∗ 𝑛
𝐼 − 2𝑃 𝑇
𝑁
=
1 − 2𝑛 𝑥
2
−2𝑛 𝑥 𝑛 𝑦 −2𝑛 𝑥 𝑛 𝑧 0
−2𝑛 𝑥 𝑛 𝑦 1 − 2𝑛 𝑦
2
−2𝑛 𝑧 0
−2𝑛 𝑥 𝑛 𝑦 −2𝑛 𝑦 𝑛 𝑧 1 − 2𝑛 𝑧
2 0
−2𝑑𝑛 𝑥 −2𝑑 −2𝑑𝑛 𝑧 1
Reflection Vector
반사 벡터를 텍스처 좌표로 바로 사용할 수 있습니다. Cube 텍스처만 있다면 반사
벡터를 구하는 방법만 알면 됩니다.
다시 임의의 평면 P를 생각해 봅시다.
P
Reflection Vector
그리고 다음과 같은 입사 벡터 v가 있다고 생각해 봅시다.
P
n
v
Reflection Vector
1. 이 벡터 v와 평면의 법선 벡터 n을 내적하면 법선 벡터 n에 투영된 v의 길이를 얻
을 수 있습니다. 이 값에 -2배를 하여 법선 벡터에 곱하면 다음과 같은 벡터 u를 얻게
됩니다.
P
n
v
u
Reflection Vector
2. 이제 이렇게 얻은 벡터 u와 벡터 v를 더하면 반사 벡터를 얻을 수 있습니다.
P
n
v
Reflection Vector
수식으로 정리하면 결국 𝑣 − 2 ∗ 𝑛 ∗ 𝑣 ∙ 𝑛 가 되고 hlsl에서는 reflect 함수로 쉽게
구할 수 있습니다.

More Related Content

What's hot

NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술Ki Hyunwoo
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .YEONG-CHEON YOU
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우Sukwoo Lee
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)포프 김
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근MinGeun Park
 
Compute shader
Compute shaderCompute shader
Compute shaderQooJuice
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더동석 김
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow MappingSukwoo Lee
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현MinGeun Park
 
[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)MinGeun Park
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑MinGeun Park
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기강 민우
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화 tartist
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유Hwan Min
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1YEONG-CHEON YOU
 

What's hot (20)

Ndc11 이창희_hdr
Ndc11 이창희_hdrNdc11 이창희_hdr
Ndc11 이창희_hdr
 
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
NDC2016 프로젝트 A1의 AAA급 캐릭터 렌더링 기술
 
Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
포인트 셰도우
포인트 셰도우포인트 셰도우
포인트 셰도우
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
 
Motion blur
Motion blurMotion blur
Motion blur
 
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
[Ndc12] 누구나 알기쉬운 hdr과 톤맵핑 박민근
 
Compute shader
Compute shaderCompute shader
Compute shader
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow Mapping
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)[0821 박민근] 렌즈 플레어(lens flare)
[0821 박민근] 렌즈 플레어(lens flare)
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
[IGC 2016] 넷게임즈 김영희 - Unreal4를 사용해 모바일 프로젝트 제작하기
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
모바일 게임 최적화
모바일 게임 최적화 모바일 게임 최적화
모바일 게임 최적화
 
[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유[KGC2014] DX9에서DX11로의이행경험공유
[KGC2014] DX9에서DX11로의이행경험공유
 
Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1Visual Studio를 이용한 어셈블리어 학습 part 1
Visual Studio를 이용한 어셈블리어 학습 part 1
 

Similar to Screen space reflection

Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow MapsBongseok Cho
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadowMoonLightMS
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자MoonLightMS
 
[0212 박민수]환경 매핑
[0212 박민수]환경 매핑[0212 박민수]환경 매핑
[0212 박민수]환경 매핑MoonLightMS
 
9강 camera advanced light2
9강 camera advanced light29강 camera advanced light2
9강 camera advanced light2JP Jung
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objectsyong gyun im
 
GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링Mark Choi
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬현찬 양
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현민웅 이
 
마른 하늘에 날구름 넣기
 마른 하늘에 날구름 넣기 마른 하늘에 날구름 넣기
마른 하늘에 날구름 넣기ajin kim
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초Seung Joon Choi
 
[0618 석재호]용기에담긴액체를위한굴절매핑
[0618 석재호]용기에담긴액체를위한굴절매핑[0618 석재호]용기에담긴액체를위한굴절매핑
[0618 석재호]용기에담긴액체를위한굴절매핑Jaeho Seok
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objectsyong gyun im
 
Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Young-jun Jeong
 
Deep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetDeep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetHyojun Kim
 
Rendering techniques
Rendering techniquesRendering techniques
Rendering techniquesJinho Yoo
 
Lighting in Stingray
Lighting in StingrayLighting in Stingray
Lighting in StingrayJaehoon Lee
 
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field종빈 오
 

Similar to Screen space reflection (20)

Reflective Shadow Maps
Reflective Shadow MapsReflective Shadow Maps
Reflective Shadow Maps
 
Depth buffershadow
Depth buffershadowDepth buffershadow
Depth buffershadow
 
[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자[1023 박민수] 깊이_버퍼_그림자
[1023 박민수] 깊이_버퍼_그림자
 
[0212 박민수]환경 매핑
[0212 박민수]환경 매핑[0212 박민수]환경 매핑
[0212 박민수]환경 매핑
 
9강 camera advanced light2
9강 camera advanced light29강 camera advanced light2
9강 camera advanced light2
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objects
 
Bump Mapping
Bump MappingBump Mapping
Bump Mapping
 
GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
D2 Rain (1/2)
D2 Rain (1/2)D2 Rain (1/2)
D2 Rain (1/2)
 
제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현제노블레이도 2 ray marching을사용한 구름 표현
제노블레이도 2 ray marching을사용한 구름 표현
 
마른 하늘에 날구름 넣기
 마른 하늘에 날구름 넣기 마른 하늘에 날구름 넣기
마른 하늘에 날구름 넣기
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초
 
[0618 석재호]용기에담긴액체를위한굴절매핑
[0618 석재호]용기에담긴액체를위한굴절매핑[0618 석재호]용기에담긴액체를위한굴절매핑
[0618 석재호]용기에담긴액체를위한굴절매핑
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objects
 
Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자Gpg2권]4 9 하늘상자
Gpg2권]4 9 하늘상자
 
Deep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNetDeep Learning Into Advance - 1. Image, ConvNet
Deep Learning Into Advance - 1. Image, ConvNet
 
Rendering techniques
Rendering techniquesRendering techniques
Rendering techniques
 
Lighting in Stingray
Lighting in StingrayLighting in Stingray
Lighting in Stingray
 
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
[GPU Gems3] Chapter 28. Practical Post Process Depth Of Field
 

More from Bongseok Cho

Light Propagation Volume.pdf
Light Propagation Volume.pdfLight Propagation Volume.pdf
Light Propagation Volume.pdfBongseok Cho
 
Spherical Harmonics.pdf
Spherical Harmonics.pdfSpherical Harmonics.pdf
Spherical Harmonics.pdfBongseok Cho
 
Temporal Anti-Aliasing
Temporal Anti-AliasingTemporal Anti-Aliasing
Temporal Anti-AliasingBongseok Cho
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현Bongseok Cho
 
비동기 파일 로딩
비동기 파일 로딩비동기 파일 로딩
비동기 파일 로딩Bongseok Cho
 
Precomputed atmospheric scattering(사전 계산 대기 산란)
Precomputed atmospheric scattering(사전 계산 대기 산란)Precomputed atmospheric scattering(사전 계산 대기 산란)
Precomputed atmospheric scattering(사전 계산 대기 산란)Bongseok Cho
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Bongseok Cho
 

More from Bongseok Cho (9)

Light Propagation Volume.pdf
Light Propagation Volume.pdfLight Propagation Volume.pdf
Light Propagation Volume.pdf
 
Spherical Harmonics.pdf
Spherical Harmonics.pdfSpherical Harmonics.pdf
Spherical Harmonics.pdf
 
Volumetric Fog
Volumetric FogVolumetric Fog
Volumetric Fog
 
Temporal Anti-Aliasing
Temporal Anti-AliasingTemporal Anti-Aliasing
Temporal Anti-Aliasing
 
C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현C++20에서 리플렉션 기능 구현
C++20에서 리플렉션 기능 구현
 
비동기 파일 로딩
비동기 파일 로딩비동기 파일 로딩
비동기 파일 로딩
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
Precomputed atmospheric scattering(사전 계산 대기 산란)
Precomputed atmospheric scattering(사전 계산 대기 산란)Precomputed atmospheric scattering(사전 계산 대기 산란)
Precomputed atmospheric scattering(사전 계산 대기 산란)
 
Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)Game Physics Engine Development (게임 물리 엔진 개발)
Game Physics Engine Development (게임 물리 엔진 개발)
 

Recently uploaded

데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 

Recently uploaded (8)

데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 

Screen space reflection

  • 2. Screen Space Reflection? Screen Space Reflection : 화면 : 공간 : 반사
  • 3. Reflection? 사람은 반사된 빛을 통해서 사물을 봅니다.
  • 4. Reflection? 그런데 눈으로 반사된 빛은 광원에서 나온 빛 뿐만이 아니라 다른 물체에서 반사된 빛일 수 있습니다.
  • 5. Reflection? 거울에서 이런 현상을 가장 잘 관찰할 수 있습니다.
  • 6. Reflection? 거울 뿐만 아니라 다양한 사물에서도 관찰할 수 있습니다.
  • 7. Reflection? 3D 애플리케이션에서 이런 반사를 어떻게 표현할 수 있을까요? 다음과 같은 임의의 평면에 놓인 하나의 거울을 생각해 봅시다. 거울 거울 앞에 놓인 사물
  • 8. Reflection? 거울과 같은 매끄러운 표면에 들어온 빛은 표면의 법선 방향에 대해서 입사각과 동일 한 각도로 반사됩니다. 거울 거울 앞에 놓인 사물
  • 9. Reflection? 그 결과 거울 평면을 대칭으로 사물의 상이 맺히게 됩니다. 3D 애플리케이션에서 장면에 거울이 하나만 있다면 거울에 맺히는 상의 위치로 사물 을 이동하여 한번 더 그리면 됩니다. 거울 거울 앞에 놓인 사물 거울에 맺힌 상
  • 10. Reflection? 즉 거울 이동 행렬을 장면의 모든 물체에 적용하여 한번씩 더 렌더링하면 됩니다. 다만 거울은 앞뒤가 반전되므로 카메라를 기준으로 뒷면인 면이 거울의 상으로 그려 질 수 있습니다. 따라서 winding order를 고려해야 합니다. 거울 거울 앞에 놓인 사물 거울에 맺힌 상
  • 11. Reflection? 이제 3D 애플리케이션에서 거울에 반사된 상을 표현할 수 있습니다. 그럼 한 장면에 거울이 여러 개라면 어떻게 하면 될까요? => 거울의 개수 만큼 반사 행렬을 만들어 물체를 여러 번 그리면 됩니다. 즉 반사 행렬을 사용한 방식은 장면의 물체 개수 X 거울의 개수 만큼 더 렌더링을 더 해야 합니다. 거울의 개수에 따라 Draw call이 증가하게 됩니다.
  • 12. Reflection? 그리고 이런 물체는 표현할 수 있을 까요? 출처 : https://en.wikipedia.org/wiki/Specular_reflection
  • 13. Reflection? 반사 행렬을 사용한 방식은 상이 맺히는 위치에 물체를 여러 번 그립니다. 구와 같이 여러 평면이 존재하는 기하 구조는 물체를 여러 번 겹쳐 그려야 합니다.
  • 14. Environment Mapping 이 경우 환경 매핑을 사용할 수 있습니다. 물체를 기준으로 주변의 환경을 렌더링하고 이 정보를 바탕으로 반사된 상을 계산하 는 것입니다. 구글 스트리트 뷰와 같은 파노라마 사진을 생각하면 됩니다. 출처 : https://www.google.co.kr/intl/ko/streetview/apps/
  • 15. Environment Mapping 주변 환경은 다양한 형식의 텍스처로 사전에 저장할 수 있고 latitude/longitude, mirrored ball, horizontal cross 등의 형식으로 저장될 수 있습니다. 출처 : http://spiralgraphics.biz/genetica/help/index.htm?environment_maps_explained.htm
  • 16. Environment Mapping 그 중에서도 정육면체 형태의 Cube 텍스처를 주로 사용하는데 간단한 셰이더 코드 로 손쉽게 환경 매핑을 구현할 수 있습니다. 물 체 Cube 텍스처 관찰 시점 TextureCube cubeTex : register( t0 ); float4 main( PS_INPUT input ) : SV_Target { return cubeTex.Sample( baseSampler, 반사 벡터); }
  • 17. Environment Mapping 반사 벡터를 통해 Cube 텍스처를 샘플링하면 다음과 같이 반사도가 높은 표면을 3D 애플리케이션에서 표현할 수 있게 됩니다. 출처 : https://learnopengl.com/Advanced-OpenGL/Cubemaps
  • 18. Environment Mapping 환경 매핑은 물체에 거울과 같은 높은 반사도를 가지는 다양한 표면이 있을 경우에 유용하게 사용될 수 있습니다. 하지만 애플리케이션내에서 실시간으로 움직이는 물체를 표현하기 위해서는 반사 행렬을 사용 했던 것처럼 주변 환경을 매번 다시 그려줘야 합니다. Cube 텍스처를 사용할 경우 6면의 텍스처 X 물체의 개수 만큼의 Draw Call이 추가 될 수 있습니다.
  • 19. Environment Mapping 또 다음과 같은 문제가 발생할 수 있습니다. 출처 : http://www.cse.chalmers.se/edu/year/2017/course/TDA361/Advanced%20Computer%20Graphics/Screen-space%20reflections.pdf
  • 20. Environment Mapping 이 문제는 주변 환경을 렌더링한 위치가 실제 반사가 일어나는 위치와 다르기 때문에 발생하는 현상입니다. Cube 텍스처 관찰 시점 Cube 텍스처는 물체의 중앙에서 렌더링 됨 반사로 가져와야 할 텍셀 위치 하지만 렌더링한 위치를 기준으로 하면 이 텍셀이 선택됨
  • 21. Environment Mapping 즉 환경 매핑은 물체에 반사되는 주변환경이 물체에서 무한한 거리만큼 떨어져 있을 경우에 적절한 효과를 제공합니다. 마지막으로 환경 매핑은 자기 자신에 대한 반사를 표현하지 못합니다. 출처 : http://schorsch.efi.fh-nuernberg.de/roettger/index.php/Computergrafik/EnvironmentMapping 주전자의 주둥이 부분이 보이지 않음
  • 22. Screen Space Reflection 반사 행렬을 사용하는 방법은 반사 행렬이 특정 표면에 제한되므로 다른 평면에 반사 되는 물체를 그리기 위해서는 행렬을 다시 구해서 물체를 중복으로 그려야 합니다. 환경 매핑은 실시간 반사를 위해서 여전히 물체를 다시 그려야 하고 반사되는 물체가 반사면에 근접해 있을 때는 괴리감이 발생할 수 있습니다. 이런 기존 기법들의 단점을 어느정도 보완한 기법이 바로 Screen Space Reflection 입니다.
  • 23. Screen Space Reflection Screen Space Reflection의 핵심을 파악하기 위해서 다음 사진을 살펴보겠습니다. 수면에 건물이 깔끔하게 반사되어 보이는 사진입니다.
  • 24. Screen Space Reflection 이 사진을 잘 살펴보면 수면에 반사하여 보이는 건물들을 사진에서 모두 찾을 수 있 다는 걸 알 수 있습니다.
  • 25. Screen Space Reflection 즉 화면 공간(Screen Space)의 데이터를 통해서 반사를 계산할 수 있습니다. 이번 프레임에 그린 장면의 데이터를 재사용하면 반사를 위해서 물체를 여러 번 그리지 않아도 되므로 장면의 복잡도에 영향을 받지 않습니다. 또한 장면은 매프레임 갱신되야 하기 때문에 실시간 반사를 위한 추가 작업이 필요하지 않습니다. 자기 자신에 대한 반사도 가능하며 특정 표면에 제한되지 않습니다.
  • 26. Screen Space Reflection 화면 공간의 데이터를 통해서 반사를 계산하려면 3가지 정보를 알고 있어야 합니다. 1. 장면의 색상 정보 2. 장면의 법선 정보 3. 장면의 위치 정보
  • 27. Screen Space Reflection Screen Space Reflection으로 아래와 같은 픽셀 위치의 반사를 계산해보겠습니다. 카메라에서 해당 픽셀 까지의 광선이 표면에 반사되어 어느 물체에 부딪히는지를 추적하면 됩니다. 이 평면이 반사도가 높은 재질
  • 28. Screen Space Reflection 카메라 공간에서 카메라의 위치는 (0, 0, 0) 이므로 해당 픽셀로 광선이 진행하는 방향은 픽셀의 카메라 공간 위치가 됩니다. 이를 장면의 위치 정보를 이용하여 얻어 냅니다.
  • 29. Screen Space Reflection 이제 해당 픽셀의 법선 벡터를 알면 반사 벡터를 구할 수 있습니다.
  • 30. Screen Space Reflection 이제 반사 벡터의 방향으로 Ray Marching을 통해서 광선이 충돌하는 위치를 알아 내고 해당 위치의 텍셀을 가져오면 됩니다. 충돌하는 위치는 어떻게 알아 낼 수 있을까요?
  • 31. Ray Marching? 광선과 어떤 표면의 충돌점을 비교적 쉽게 구할 수 있는 방법을 한번 살펴보겠습니다. 어떤 광선이 구에 충돌한다면 그 충돌점은 광선과 구를 함수로 표현한 다음 광선의 함수를 구의 함수에 대입하는 것으로 계산할 수 있습니다. 광선을 함수로 표현 : 𝑅 𝑡 = 𝑃 + 𝑡𝑑 𝑡 ≥ 0 구를 함수로 표현 : 𝑋 − 𝐶 ∙ 𝑋 − 𝐶 = 𝑟2 𝑃 + 𝑡𝑑 − C ∙ 𝑃 + 𝑡𝑑 − C = 𝑟2 𝑚 + 𝑡𝑑 ∙ 𝑚 + 𝑡𝑑 = 𝑟2 (𝑃 − 𝐶를 𝑚으로 치환) 𝑑 ∙ 𝑑 𝑡2 + 2 𝑚 ∙ 𝑑 𝑡 + (𝑚 ∙ 𝑚) = 𝑟2 (전개) 𝒕 𝟐 + 𝟐 𝒎 ∙ 𝒅 𝒕 + 𝒎 ∙ 𝒎 − 𝒓 𝟐 = 𝟎 (𝒅 ∙ 𝒅 = 𝟏) 근의 공식을 통해서 𝒕 를 구할 수 있고 이를 광선의 함수에 대입하면 위치
  • 32. Ray Marching? 이렇게 특정 표면을 함수로 표현할 수 있는 경우에는 충돌점을 비교적 쉽게 찾아 낼 수 있습니다. 하지만 이미 그려진 복잡한 장면의 표면은 함수로 표현하기 어렵습니다. Ray Marching으로 표면 함수가 쉽게 풀리지 않을 경우에 표면과 광선의 충돌점을 찾아낼 수 있습니다.
  • 33. Ray Marching? 다음과 같은 표면에서 Ray Marching을 사용하여 광선의 충돌점을 찾아보겠습니다. Ray Origin
  • 34. Ray Marching? 광선을 진행 방향으로 일정거리 만큼 진행합니다. 해당 위치가 표면과 충돌했는지 검사합니다. 이 단계에서는 충돌하지 않았습니다. Ray Origin
  • 35. Ray Marching? 표면과 충돌 할 때 까지 반복합니다. 이제 표면과 충돌하였습니다. Ray Origin
  • 36. Ray Marching? 알아낸 충돌위치에서 추가적으로 이진탐색을 수행하여 정확도를 높일 수 있습니다. Ray Origin 이전 진행 길이의 절반 만큼을 반대로 이동 충돌했는지 여부에 따라 진행방향을 변경하고 진행 길이를 절반씩 줄여가며 이동
  • 37. Ray Marching? 이런 식으로 행진하듯이 광선의 진행 방향으로 일정 거리만큼 이동시켜 가며 충돌점 을 찾아내는 방식을 Ray Marching이라고 합니다. 충돌점을 찾아내는 것 외에도 Ray Marching은 균일하지 않은 볼륨을 가진 투명한 물체를 그릴 때도 사용됩니다. 출처 : https://en.wikipedia.org/wiki/Volume_ray_casting
  • 39. Screen Space Reflection Using Ray Marching float4 main( PS_INPUT input ) : SV_TARGET { float3 incidentVec = normalize( input.viewPos ); float3 viewNormal = normalize( input.viewNormal ); float3 reflectVec = reflect( incidentVec, viewNormal ); reflectVec = normalize( reflectVec ); reflectVec *= g_rayStepScale; float3 reflectPos = input.viewPos; float thickness = g_maxThickness / g_FarPlaneDist; [loop] for ( int i = 0; i < g_maxRayStep; ++i ) { float3 texCoord = GetTexCoordXYLinearDepthZ( reflectPos ); float srcdepth = depthbufferTex.SampleLevel( baseSampler, texCoord.xy, 0 ).x; float depthDiff = texCoord.z - srcdepth; if ( depthDiff > g_depthbias && depthDiff < thickness ) { float4 reflectColor = BinarySearch( reflectVec, reflectPos ); float edgeFade = 1.f - pow( length( texCoord.xy - 0.5f ) * 2.f, 2.f ); reflectColor.a *= pow( 0.75f, (length( reflectPos - input.viewPos ) / g_maxRayLength) ) * edgeFade; return reflectColor; } else { reflectPos += ( i + Noise( texCoord.xy ) ) * reflectVec; } } return float4(0.f, 0.f, 0.f, 0.f); } 반사 벡터 계산 Ray Marching 충돌점을 못 찾았을 때 광선을 진행 첫 충돌 후 이진 탐색
  • 40. Screen Space Reflection Using Ray Marching Screen Space Reflection 은 다른 화면 공간 알고리즘 (대표적으로 SSAO)과 마찬가지로 해결할 수 없는 약점을 가지고 있는데 화면 공간 외의 기하정보를 알지 못합니다. 월드 공간상에 또 다른 물체가 이렇게 위치하고 있다면 해당 물체에 대한 정보를 얻을 수 없습니다. 또한 가려진 물체에 대한 정보도 얻을 수 없습니다.
  • 41. Screen Space Reflection Using Ray Marching 정보를 얻을 수 없는 경우에는 다음과 같은 아티팩트를 확인할 수 있습니다. 윈도우 밖에 있는 경우 물체에 가려진 경우
  • 42. Screen Space Reflection Using Ray Marching 이런 아티팩트로 인한 어색한 비주얼을 최소화하기 위해서 다음과 같은 처리를 합니다. 1. 윈도우 가장자리에 가까우면 Fade out 시킴 2. 일정 크기의 두께 값 혹은 두께를 저장한 텍스처를 사용 float edgeFade = 1.f - pow( length( texCoord.xy - 0.5f ) * 2.f, 2.f ); reflectColor.a *= pow( 0.75f, (length( reflectPos - input.viewPos ) / g_maxRayLength) ) * edgeFade; return reflectColor; float thickness = g_maxThickness / g_FarPlaneDist; // 일정 크기의 두께 값 // ... if ( depthDiff > g_depthbias && depthDiff < thickness ) { float4 reflectColor = BinarySearch( reflectVec, reflectPos ); // ... }
  • 43. Screen Space Reflection Using Ray Marching Ray Marching을 사용한 Screen Space Reflection 기법에서 마지막으로 광선의 진행 길이에 대해 살펴보도록 하겠습니다. 광선의 진행 길이는 고정 값을 사용하는 것이 아니라 사용자의 설정 값에 따라 변동 될 수 있습니다. 진행 길이를 늘리면 Ray Marching이 좀 더 빨리 끝나 성능상 이득을 얻을 수 있나 적절하지 않은 진행 길이를 설정하면 다음과 같은 아티팩트를 관찰 할 수 있습니다.
  • 45. Screen Space Reflection Using Ray Marching 진행 길이가 너무 늘어나면 어떤 위치에서는 광선이 물체를 그냥 통과해버리게 되고 그 결과 반사된 상에 군데 군데 구멍이 생기게 됩니다. 광선의 진행 길이는 장면에 따라 신중하게 결정해야 하는데 이것이 쉽지 않습니다. 3차원 공간에서 Ray Marching은 원근법 때문에 어떤 픽셀은 과하게 샘플링 될 수 도 있고 어떤 픽셀은 덜 샘플링 될 수 있습니다. 출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html 과하게 샘플링 된 부분 같은 픽셀을 여러 번 샘플링 할 수록 붉은색 덜 샘플링 된 부분 광선 경로에 있는 몇몇 픽셀을 건너 뛰는 것이 관찰됨 화면 공간에서 본 3D Ray March
  • 46. Screen Space Ray Tracing 3차원 공간의 Ray Marching의 문제를 해결하기 위해서 화면 공간에서 Ray Marching을 수행합니다. 화면 공간에서의 Ray Marching은 선분 그리기 알고리즘인 DDA( Digital Differential Analyzer ) 알고리즘을 사용합니다. 출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html
  • 47. Digital Differential Analyzer DDA 알고리즘은 다음과 같은 단계로 수행됩니다. 1. 그리고자 하는 선분의 기울기를 계산 (𝑚 = 𝑦 𝑒𝑛𝑑−𝑦 𝑠𝑡𝑎𝑟𝑡 𝑥 𝑒𝑛𝑑−𝑥 𝑠𝑡𝑎𝑟𝑡 ) 2. 기울기가 양수이고 𝑚 ≤ 1 일 경우 x축 방향으로 1식 증가하면서 y값을 계산 𝑥 𝑘+1 = 𝑥 𝑘 + 1 𝑦 𝑘+1 = 𝑦 𝑘 + 𝑚 3. 1 < 𝑚 일 경우 y축 방향으로 1식 증가하면서 x값을 계산 𝑥 𝑘+1 = 𝑥 𝑘 + 1 𝑚 𝑦 𝑘+1 = 𝑦 𝑘 + 1 4. 기울기가 음수 일 경우에도 픽셀 위치를 계산하기 위해 유사한 계산이 이뤄짐
  • 49. Screen Space Reflection Using Digital Differential Analyzer
  • 50. Screen Space Reflection Using Digital Differential Analyzer float4 main( PS_INPUT input ) : SV_TARGET { float3 incidentVec = normalize( input.viewPos ); float3 viewNormal = normalize( input.viewNormal ); float3 reflectVec = reflect( incidentVec, viewNormal ); reflectVec = normalize( reflectVec ); float3 hitPixel_alpha; bool isHit = TraceScreenSpaceRay( reflectVec, input.viewPos, hitPixel_alpha ); float3 color = framebufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).rgb; return float4( color, hitPixel_alpha.z ) * isHit; } 반사 벡터 계산 충돌 여부 및 충돌한 픽셀 좌표를 계산 bool TraceScreenSpaceRay( float3 dir, float3 viewPos, out float3 hitPixel_alpha ) { float rayLength = ( viewPos.z + dir.z * g_maxRayLength ) < g_nearPlaneDist ? ( g_nearPlaneDist - viewPos.z ) / dir.z : g_maxRayLength; hitPixel_alpha = float3( -1, -1, 1 ); float3 rayEnd = viewPos + dir * rayLength; float4 ssRayBegin = mul( float4( viewPos, 1.0 ), g_projectionMatrix ); float4 ssRayEnd = mul( float4( rayEnd, 1.0 ), g_projectionMatrix ); float k0 = 1 / ssRayBegin.w; float k1 = 1 / ssRayEnd.w; 화면 공간으로 광선의 시작점, 끝점을 변환
  • 51. Screen Space Reflection Using Digital Differential Analyzer float2 P0 = ssRayBegin.xy * k0; float2 P1 = ssRayEnd.xy * k1; P0 = ( P0 * 0.5 + 0.5 ) * g_targetSize; P1 = ( P1 * 0.5 + 0.5 ) * g_targetSize; P1 += ( dot( P1 - P0, P1 - P0 ) < 0.0001 ) ? float2( 0.01, 0.01 ) : float2( 0, 0 ); float2 delta = P1 - P0; bool permute = false; if ( abs( delta.x ) < abs( delta.y ) ) { permute = true; delta = delta.yx; P0 = P0.yx; P1 = P1.yx; } float stepDir = sign( delta.x ); float invdx = stepDir / delta.x; float stepCount = 0; float rayZ = viewPos.z; float sceneZMax = viewPos.z + 100.f; float end = stepDir * P1.x; float3 Pk = float4( P0, k0 ); float3 dPk = float4( float2( stepDir, delta.y * invdx ), ( k1 - k0 ) * invdx ); dPk *= g_rayStepScale; float thickness = g_maxThickness; 화면 공간으로 광선의 시작점, 끝점을 변환 기울기 계산 후 DDA delta 값을 계산 1 < 𝑦 𝑒𝑛𝑑 − 𝑦𝑠𝑡𝑎𝑟𝑡 𝑥 𝑒𝑛𝑑 − 𝑥 𝑠𝑡𝑎𝑟𝑡 = 𝑥 𝑒𝑛𝑑 − 𝑥 𝑠𝑡𝑎𝑟𝑡 < 𝑦 𝑒𝑛𝑑 − 𝑦𝑠𝑡𝑎𝑟𝑡
  • 52. Screen Space Reflection Using Digital Differential Analyzer [loop] for ( ; ( ( Pk.x * stepDir ) <= end ) && ( stepCount < g_maxRayStep ) && ( ( rayZ < sceneZMax ) || ( ( rayZ - thickness ) > sceneZMax ) ) && ( sceneZMax != 0.0 ); Pk += dPk, stepCount += 1 ) { hitPixel_alpha.xy = permute ? Pk.yx : Pk.xy; hitPixel_alpha.xy *= g_invTargetSize; hitPixel_alpha.y = 1 - hitPixel_alpha.y; rayZ = 1 / Pk.w; sceneZMax = depthbufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).x; thickness = backfaceDepthBufferTex.SampleLevel( baseSampler, hitPixel_alpha.xy, 0 ).x * g_FarPlaneDist; sceneZMax *= g_FarPlaneDist; thickness -= sceneZMax; sceneZMax += g_depthbias; } float edgeFade = 1.f - pow( length( hitPixel_alpha.xy - 0.5 ) * 2.f, 3.0f ); hitPixel_alpha.z = edgeFade; return ( rayZ >= sceneZMax ) && ( rayZ - thickness <= sceneZMax ); } Ray Marching // 광선이 끝까지 진행하기 전까지 // 최대 Ray Marching 단계에 도달하기 전까지 // 물체에 부딪히기 전까지 // 화면 공간에서 광선을 진행
  • 53. Summary 기존 반사 표현 방식의 단점을 보완할 수 있는 대안 기술이라고 할 수 있습니다. 성능이 장면의 복잡도에 영향을 받지 않지만 비용이 낮다고는 할 수 없습니다. 2차원 텍스처로 기록된 장면 정보만을 사용하기 때문에 정보 부족으로 인한 다양한 문제가 발생 할 수 있습니다. 출처 : http://casual-effects.blogspot.com/2014/08/screen-space-ray-tracing.html 왼쪽부터 차례대로 1. 절두체 밖의 정보 X 2. 물체 뒷부분의 정보 X 3. 가려진 물체에 대한 정보 X
  • 55. Future? 2018년도 9월 20일에 출시한 GeForce RTX 20 시리즈에서 실시간 레이 트레이싱 기능을 지원합니다. 실시간 레이 트레이싱을 통해서 기존 기술들의 한계점에서 벗어나 반사 뿐만이 아니 라 굴절, 그림자도 계산할 수 있습니다. 다만 실시간 레이 트레이싱이 하드웨어에 종속적인 기술이고 가격대가 높게 책정되 어 있어 ( RTX 2070이 60만원 후반 ) 보편적으로 정착할 수 있을지 두고 볼 필요가 있습니다.
  • 59. Reference 아이콘 출처 : https://www.flaticon.com/ 구와 광선의 충돌 : Real-Time Collision Detection (Christer Ericson) Screen Space Ray Tracing : http://casual-effects.blogspot.com/2014/08/screen-space- ray-tracing.html Battlefield V: Official GeForce RTX Real-Time Ray Tracing Demo : https://youtu.be/WoQr0k2IA9A 그 밖에 좋은 사이트 들 : http://www.kode80.com/blog/2015/03/11/screen-space-reflections-in-unity-5/ http://tips.hecomi.com/entry/2016/04/04/022550
  • 61. Reflection Matrix 거울에 맺히는 상의 위치를 찾기 위해서 임의의 평면 P를 생각해 보겠습니다. P
  • 62. Reflection Matrix 그리고 한 점 v가 다음과 같이 위치해 있다고 하겠습니다. P n v
  • 63. Reflection Matrix 임의의 평면 P를 기준으로 v가 대칭 이동한 위치를 구해야 합니다. 1. 점 v의 위치를 벡터로 취급하여 평면 P의 법선 벡터와 내적합니다. 그 결과로 n에 투영된 v의 길이를 알 수 있습니다. P n v v’
  • 64. Reflection Matrix 2. 평면 P에 대해서 대칭 이동한 v의 위치는 이 길이(𝑣′ ∙ 𝑛) 의 2배 만큼의 거리를 법선 n의 반대 방향으로 이동한 위치가 됩니다. P n v v’
  • 65. Reflection Matrix 수식으로 정리하자면 가 되고 이를 행렬로 표현하면 다음과 같습니다. 𝑣 − 2 ∗ 𝑣′ ∙ 𝑛 ∗ 𝑛 𝐼 − 2𝑃 𝑇 𝑁 = 1 − 2𝑛 𝑥 2 −2𝑛 𝑥 𝑛 𝑦 −2𝑛 𝑥 𝑛 𝑧 0 −2𝑛 𝑥 𝑛 𝑦 1 − 2𝑛 𝑦 2 −2𝑛 𝑧 0 −2𝑛 𝑥 𝑛 𝑦 −2𝑛 𝑦 𝑛 𝑧 1 − 2𝑛 𝑧 2 0 −2𝑑𝑛 𝑥 −2𝑑 −2𝑑𝑛 𝑧 1
  • 66. Reflection Vector 반사 벡터를 텍스처 좌표로 바로 사용할 수 있습니다. Cube 텍스처만 있다면 반사 벡터를 구하는 방법만 알면 됩니다. 다시 임의의 평면 P를 생각해 봅시다. P
  • 67. Reflection Vector 그리고 다음과 같은 입사 벡터 v가 있다고 생각해 봅시다. P n v
  • 68. Reflection Vector 1. 이 벡터 v와 평면의 법선 벡터 n을 내적하면 법선 벡터 n에 투영된 v의 길이를 얻 을 수 있습니다. 이 값에 -2배를 하여 법선 벡터에 곱하면 다음과 같은 벡터 u를 얻게 됩니다. P n v u
  • 69. Reflection Vector 2. 이제 이렇게 얻은 벡터 u와 벡터 v를 더하면 반사 벡터를 얻을 수 있습니다. P n v
  • 70. Reflection Vector 수식으로 정리하면 결국 𝑣 − 2 ∗ 𝑛 ∗ 𝑣 ∙ 𝑛 가 되고 hlsl에서는 reflect 함수로 쉽게 구할 수 있습니다.