레이마칭에서 Height Map Distance Field
개요
이번에는 레이 마칭에서 Height Map을 사용하여 요철이있는 평면을 그려 보겠습니다.
실제로 렌더링한 결과는 다음과 같은 느낌이 됩니다.
애니메이션된 녀석↓
Shadertoy에서 실제로 움직이는 데모도 있습니다.
보면 알겠지만, 매우 「평면」에는 보이지 않습니다 w
하지만, 거리 함수 자체는 평면의 것을 사용해, 거리에 다소 세공을 해 이 묘화를 실시하고 있습니다.
이번 구현에 대해서는 「이런 느낌일까」라고 하는 상상으로 했습니다.
다만 Shadertoy에서는 아래와 같이 코멘트를 받았기 때문에, 기본적인 어프로치는 맞다고 생각합니다.
Most heightmap distance field formula will look like this yeah.
구현 해설
거리 함수
이번 구현의 거리 함수를 우선 코드로 나타냅니다.
거리 함수
// テクセル(高さ)の倍率
const float heightFactor = 3.0;
// 平面との距離関数
float distPlane(in vec3 p, vec4 n)
{
return dot(p, n.xyz) * n.w;
}
// Height Mapを使った距離関数
float distFunc(in vec3 p)
{
float d = distPlane(p, plane);
vec4 tex = texture(iChannel0, mod(p.xz * 0.2, 1.0));
tex *= heightFactor;
return d - tex.x;
}
distFunc
가 거리 함수입니다.내부에서는 평면과의 거리 함수인
distPlane
를 호출 결과를 조금 조작하고 있습니다.세공은,
vec4 tex = texture(iChannel0, mod(p.xz * 0.2, 1.0));
return d - tex.x;
의 부분이군요. (
heightFactor
는 단순히 텍셀의 값을 증감시킬 목적으로 준비하고 있습니다)덧붙여서 이
texture
함수입니다만, 이것은 Shadertoy상에 정의되고 있는 함수입니다.제 1 인수에 건네주고 있는
iChannel0
는, 이것도 Shadertoy상에서 준비되어 있는 텍스처에의 참조입니다.이번 예에서는 보통 텍스처 샘플링이라고 생각해도 괜찮습니다.
XZ 평면에 텍스처 샘플링
그런데 여기서 하고 있는 것입니다만,
p.xz
라고 하는 파라미터를 사용하고 있습니다.이것은 평면에 대한 거리 함수를 구한 후, 그 시점에서의 레이의 위치를 UV 좌표로서 이용해, 평면의 텍스처를 (개념적으로) 샘플링합니다.
그리고 샘플링한 텍셀의 값(즉 높이)을, 구해 둔 평면과의 거리로부터 감산하는 것으로 평면과의 거리를 조작하고 있다는 것입니다.
라고 말하면 이해하기 어렵기 때문에 그림으로하면 다음과 같은 느낌이됩니다.
원래는 평평한 평면에서 HeightMap을 사용하여 의사적으로 평면에 요철을 만들어 내고 있다는 것이군요.
거리에 대한 계산이 되어 버리면, 나머지는 통상의 레이마칭의 구조에 따라 법선도 요구되고, 라이팅이나 쉐이딩을 실시할 수 있다는 것입니다.
참고로 이번에 사용하는 텍스처는 다음 이미지입니다.
이번에는 HeightMap의 구현을 확인하는 것이 목적이었기 때문에 Shadertoy에 준비되어 있는 텍스처를 사용했습니다만, 실제로는 「프랙탈 브라운 운동(Fractal Brownian Motion(FBM))」이라고 불리는 펄린 노이즈와 비슷한 노이즈 함수를 이용하여 런타임으로 지면을 생성하고 렌더링하는 것이 일반적인 것 같습니다. (Shadertoy에서)
덧붙여서, 프랙탈 브라운 운동에 대해서는 이쪽의 기사가 실장 포함으로 해설해 줍니다. (단, 화상의 링크가 끊어져 버리고 있습니다만・・・)
이상이 HeightMap을 사용한 지형의 렌더링입니다.
그 이외의 레이마칭의 구현은 일반적인 구현이라고 생각하므로 해설은 할애합니다.
레이마칭 자체의 구조 등에 대해서는 이전에 기사를 썼으므로 그쪽을 참조하십시오.
(vol.1이라고 말하면서 vol.2 쓰지 않는다···;)
기타 참고 기사
Reference
이 문제에 관하여(레이마칭에서 Height Map Distance Field), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/edo_m18/items/af7fa86541634b59466f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)