[Unreal_Rendering]HeightFog 개선

2024. 6. 12. 23:06unreal/UnrealRendering

기본 제공하는 포그로 하늘을 가릴정도로 깔려면 지상에도 너무 강하게 깔려 해당 요소를 제어할 있도록(하늘만 강하게 혹은 하늘과 땅을 분리?)하는 기능을 추가하도록 하겠습니다.

관련 파일들

 

 

쉐이더 분석

 

포그 렌더링쪽 쉐이더 파일을 보면 

포그의 강도계산이후 라이팅 의 컬러나 스케터링을 재 계산하게 됩니다.

위의 이미지는 포그렌더링 시작의 파라메터 세팅(나중에 다시 보게됩니다)

중간에 강도 계산부분

이 중간에 강도가 계산이 되는 부분을 재 구성해줘야 합니다.

강도를 구성하는 함수입니다.

 

익숙한 이름이 많이 보이니 그부분은 넘어갑니다(실제로 같은이름의 값입니다)

대충 내용을보니

FLT_EPSILON2 의 값을기준으로

계산식이 달라지는것으로 저 위의 디파인된 값은 상수로 임의의 지평선입니다.

저의는 포그의 하늘부분을 바꿀것이기때문에 지평선쪽함수에는 신경쓰지 않아도 됩니다.

 

정확히 원하는 위치를 제어하기위해서는 위의 성분들중 무언지 명확하지 않은 값들은 분석을해야합니다

(실제로 저도 처음에 쉽게 짐잡해서 값을 넣었다가 잘안되서 분석을 한뒤에 수정하였습니다.)

rayorigineterms  와 raydirectionz 가 강도에 영향을 크게 주는 파라메터인데 

 

초기 이미지쪽에 값들을 세팅할때 등장합니다

float RayOriginTerms = FogStruct.ExponentialFogParameters.x;

FogStruct.ExponentialFogParameters.x 가 뭔지 보려면 cpp 파일에 가야겠지만 쉐이더 내부에 명시가 되어있습니다.

 

 

RayOriginTerms 은 포그밀도 * 감쇠의 제곱 * 포그의 높이와 카메라 높이의 차 를 곱해준 값입니다.

위에 파라메터들에는 제가 원하는 내용이 없네요 하늘만 제어하고 싶으니 넘어가줍니다

 

raydirectionz = cameratoreceiver.z 이고 계속 파라메터를 타고 들어가다보면

카메라 뷰 기준으로 윗쪽은 양의 수로 값이 커지고 아랫쪽은 음의 수로 수자체는 커집니다.

 

다시 식으로 돌아가서

float Falloff = max(-127.0f, FogHeightFalloff * RayDirectionZ); // if it's lower than -127.0, then exp2() goes crazy in OpenGL's GLSL.

float LineIntegral = (1.0f - exp2(-(Falloff))) / ( Falloff);

 

falloff 값아주 작지만 멀어지면 수 자체는 커지고 부로호 방향을 결정하는 값입니다.

 

""안에 내용은 무시하고 맨 아래 최종계산으로 가셔도 됩니다.

"멀어지면 (부호없이 수만) 커지는 값을 제곱을합니다(부호 무시) 그리고 1에서 빼준뒤 낮으면 - 되는 값으로 나눔

높을수록 1에서 뺀결과 값이 적이지므로  분자가 작아지며 높을수록 분모가 양수쪽으로 커짐(큰수로 나눔)

카메라보다 낲으면 낮을수록 결과 값이 적어지므로(제곱이기에 음수무시) 분자가 역시 작아지며 낮을수록 분모가 음수쪽으로 커짐(작은수로 나눔)"

 

최종적으로 계산방식은

분자는 카메라의 거리에따라 작아지며 분모는 카메라 위쪽에서는 커지고 아래쪽에서는 작아짐

 

저는 카메라 윗쪽으로 생각되는 하늘은 분자가 작아지면서 약해지는걸  원하지 않기에

 

float CalculateLineIntegralShared(float FogHeightFalloff, float RayDirectionZ, float RayOriginTerms)

{

float Falloff = max(-127.0f, FogHeightFalloff * RayDirectionZ); // if it's lower than -127.0, then exp2() goes crazy in OpenGL's GLSL.

float FalloffSky = max(-127.0f, (FogHeightFalloff) * (RayDirectionZ - (RayDirectionZ * (min(0.999, FogStruct.SkyFog)))));

 

float LineIntegral = (1.0f - exp2(-(RayDirectionZ > 0 ? FalloffSky : Falloff))) / (RayDirectionZ > 0 ? FalloffSky : Falloff);

float LineIntegralTaylor = log(2.0) - (0.5 * Pow2(log(2.0))) * Falloff; // Taylor expansion around 0

 

return RayOriginTerms * (abs(Falloff) > FLT_EPSILON2 ? LineIntegral : LineIntegralTaylor);

}

하늘의 경우 높이값(falloff) 삭제해주는 파라메터를 넣어서  하늘을 가려주기로 했습니다.

 

 

이제 쉐이더 작업은 마무리 되었고

 

에디터에서 변경할 수 있도록 쉐이더 파라메터를 찾았으나

HeightFogCommon.ush 파일이 바인딩 되어 있는 파일은 찾을 수 없었고 이번에는 쓰고 상수로 교체후 버릴 파라메터가

아니고 지속적으로 세팅을 해서 유지해야하는 값이라 적절한 곳을 넣어주기위해 쉐이더를 살펴보았습니다

가장 쉽게 접근하고 문제가 되지 않아 보이는 구조체가  FogStruct로 판단되어 저 구조체에 작업을 하기로 결정

 

일단 쉐이더에서 사용할 유니폼 버퍼 내부 포그 구조체에 필드를 추가해줍니다.

 

Fogrendering.h

Fogrendering.cpp

등록

 

 

포그 렌더링 -> 쉐이더 바인딩은 완료되었으니

 

heightfog 액터 > 씬프록시 (scenerendering.h / cpp)> 포그렌더링순으로 변수를 추가해 줍니다

 

포그 컴포넌트에 변수 추가

위치는 맨위일필요는 없지만 스샷찍기 편하게 맨위로 옮겨두었습니다.

 

여기까지 구성이 끝나면

에디터의 포그액터에 skyfog 란 파라메터가 생성되고 하늘만 별도로 제어할 수 있습니다.

좌 - 스카이포그 끔 / 우 스카이 포그 설정

 

스카이 포그는 이미지에는 보이지 않지만 하늘에 오브젝트가 떠잇을시 높은부분은 포그로 가리고 지상에 가까운부분은 보이게되는 포그를 반전시킨 모습을 표현 할 수 있습니다.

좌 - 기존 기능(감쇠기능)으로 하늘을 가렸을시 / 우 - 개발한 기능으로 하늘을 가릴시

'unreal > UnrealRendering' 카테고리의 다른 글

[Unreal_Rendering]ToonShading  (0) 2024.06.18
[Unreal_Rendering]ToneMapper 수정  (0) 2024.06.12