[DirectX 11] Deferred Fog

2022. 2. 21. 16:23·Graphics

Deferred Fog

- 프로젝트 진행중 아트측 요청으로인해 거리기반, 높이기반 Fog가 필요하여 후처리 Fog를 구현하는 도중 움직이는 효과가 있으면 조금 더 자연스럽겠다는 생각에 Perin Noise 3D Texture를 활용하여 제작하였다.

 

Distance Fog

- Fog를 표현할 설정한 시작 지점부터 점점 Fog가 진해지도록 하였다.

Distance Offset
Distance Value

Height Fog

- 맵 위에선 얕게 바닥에 깔리는 느낌을 주기위해 해당 범위의 높이에서만 표현되도록 하였다.

- 맵 외의 멀리 있는 부분은 전체적으로 설정한 높이를 기준으로 높이가 낮아질수록 Fog가 진해지도록 하였다.

 

Height Offset
Height Value

 

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이다.

 

적용 영상

Deferred Fog 적용 영상

 

저작자표시 (새창열림)

'Graphics' 카테고리의 다른 글

[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
'Graphics' 카테고리의 다른 글
  • [DirectX 11] Game Engine & Graphic Engine 분리 및 Render Data 전달 방식
  • [DirectX 11] Hardware Instancing
  • [DirectX 11] Bloom
  • [DirectX 11] Lambert / Half Lambert
KyuHwang
KyuHwang
  • KyuHwang
    DirectX Engine
    KyuHwang
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • C++ (4)
      • CS (0)
      • Graphics (32)
      • DLL (2)
      • Shader (7)
      • Project (4)
      • ETC (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • YouTube
  • 공지사항

  • 인기 글

  • 태그

    texture block compression
    std::enable_if
    mobile format
    Win API
    hlsl
    Directx11
    RunTime Compile Shader
    animation retargeting
    animation constraint
    Explicit Linking
    dll
    DLL Interface
    Order Independent Transparency
    DirectX 2D
    Return Type Operator
    nvtt
    Implicit Linking
    Project
    bc format
    shader
    Shader Resource 관리
    Shader Reflection
    Hash Code
    Define Macro
    std::is_base_of
    rigging chain
    Alpha Blending
    Define Function
    C ++
    Shader Macro
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
KyuHwang
[DirectX 11] Deferred Fog
상단으로

티스토리툴바