[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
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바