Deferred Fog
- 프로젝트 진행중 아트측 요청으로인해 거리기반, 높이기반 Fog가 필요하여 후처리 Fog를 구현하는 도중 움직이는 효과가 있으면 조금 더 자연스럽겠다는 생각에 Perin Noise 3D Texture를 활용하여 제작하였다.
Distance Fog
- Fog를 표현할 설정한 시작 지점부터 점점 Fog가 진해지도록 하였다.
Height Fog
- 맵 위에선 얕게 바닥에 깔리는 느낌을 주기위해 해당 범위의 높이에서만 표현되도록 하였다.
- 맵 외의 멀리 있는 부분은 전체적으로 설정한 높이를 기준으로 높이가 낮아질수록 Fog가 진해지도록 하였다.
Perin Noise Texture 3D
- 미리 생성해둔 Perin Noise Texture 3D를 활용하여 해당 Object의 Position을 활용하여 Noise Texture 를 Sampling을 하되, 움직이는 효과를 주기위해 현재 시간을 Texture의 x, y값의 변화를 주도록 하였다.
- Position 값을 그대로 적용하는경우 Texture의 크기와 맞지 않아 해당 Texture 크기로 정규화를 실행한 후에 설정하였다.
float3 ApplyFog(float3 originalColor, float3 toEye, float noise)
{
// 지정 범위로 변환된 Distance..
float pixelDistance = convertPercent * (length(gEyePosW - toEye) - gFogStartDepth);
// 지정 범위로 변환된 Height..
float pixelHeight = convertPercent * toEye.y;
float distanceOffset = min(pow(2.0f, pixelDistance - gFogStartDistance), 1.0f);
float heightOffset = min(pow(1.2f, -(pixelHeight + 3.0f)), 1.0f);
// 거리 기반 안개 강도 설정..
float distanceValue = exp(0.01f * pow(pixelDistance - gFogDistanceValue, 3.0f));
float fogDistanceFactor = min(distanceValue, 1.0f);
// 높이 기반 안개 강도 설정..
float heightValue = (pixelHeight * gFogHeightValue) - 0.1f;
float fogHeightFactor = pow(pow(2.0f, -heightValue), heightValue) * (1.0f - distanceOffset);
// 두 요소를 결합한 최종 요소..
float fogFinalFactor = min(fogDistanceFactor * fogHeightFactor * noise, 1.0f) + min(distanceOffset * heightOffset, 1.0f) + 0.01f;
// 최종 혼합 색상..
return lerp(originalColor, gFogColor, fogFinalFactor);
}
float4 Fog_PS(ScreenPixelIn pin) : SV_TARGET
{
float3 outColor = gOriginMap.Sample(gSamClampLinear, pin.Tex);
float3 position = gPositionRT.Sample(gSamClampLinear, pin.Tex).xyz;
// 현재 Position을 Perlin Noise Texture 크기로 정규화..
float3 coord = float3(int3(position * 100) % 12800) / 12800.0f;
// 움직이는 효과를 위해 시간대비 이동..
coord.x += gTime;
coord.y += gTime;
// Noise 값
float noise = gNoiseVolume.SampleLevel(gSamWrapLinear, coord, 0).x;
outColor = any(position) ? ApplyFog(outColor, position, noise) : lerp(outColor, gFogColor, 0.75f);
return float4(outColor, 1.0f);
}
- Distance 기준 Fog Factor와 Height 기준 Fog Factor를 혼합하여 적용하는 Shader Code이다.
적용 영상
'DirectX 11' 카테고리의 다른 글
[DirectX 11] Game Engine & Graphic Engine 분리 및 Render Data 전달 방식 (0) | 2022.03.07 |
---|---|
[DirectX 11] Hardware Instancing (0) | 2022.03.02 |
[DirectX 11] Bloom (1) | 2022.02.17 |
[DirectX 11] Lambert / Half Lambert (0) | 2022.02.07 |
[DirectX 11] Tone Mapping (0) | 2022.02.03 |