[DirectX 11] Terrain Mesh Blending

2021. 12. 20. 02:59·Graphics

Terrain Mesh Blending

- 현재 프로젝트 진행중 Unreal Data를 이용하여 Terrian Material Layer 들의  Mask Image와 각각의 Material Texture을

   이용하여 Texture Blending을 한다.

- 현재 프로젝트에서 사용하고있는 Terrian Layer는 두개를 사용하기에 R, G Channel 만 이용.

 

Terrain Layer Mask Image

 

Texture Blending

- 위의 이미지는 100 x 100 단위로 1 Pixel에 해당 Material 가중치가 들어있는데, 위 데이터를 활용하여 Terrain의 Blending을 할

  수 있다.

- Terrain의 경우 일반 Mesh 와는 다르게 Vertex Buffer에 해당 Vertex의 Mask Color를 입력해두어 내부 Pixel Shader측에서

해당 Mask Color에 따른 Blending을 해준다.

- 해당 Mask Image를 읽는것은 stb_image Library를 사용하여 Pixel별 Color 값을 얻어왔다.

template<>
void GraphicResourceFactory::CreateLoadBuffer<TerrainVertex>(ParserData::Mesh* mesh, LoadMeshData* meshData)
{
	...
    
	// Mask Pixel Data Parsing..
	ParserData::ImageData maskImage = m_Parser->LoadImagePixel(meshData->Mask_Name.c_str(), 4);

	std::vector<TerrainVertex> vertices(vCount);
	for (UINT i = 0; i < vCount; i++)
	{
		vertices[i].Pos = mesh->m_VertexList[i]->m_Pos;

		vertices[i].Tex.x = vertices[i].Pos.x;
		vertices[i].Tex.y = vertices[i].Pos.z;

		vertices[i].Normal = mesh->m_VertexList[i]->m_Normal;
		vertices[i].Tangent = mesh->m_VertexList[i]->m_Tanget;
		
		// 해당 Pixel Mask Color..
		vertices[i].Mask = m_Parser->GetPixelColor(maskImage, abs(vertices[i].Pos.x), abs(vertices[i].Pos.z));
	}

	...
    
}

- Terrain Mesh Buffer를 만드는 시점에 해당 Layer Mask Image를 Pixel 별 Color 값을 미리 읽은 후 해당하는 영역의

   Vertex Buffer Data에 Mask Color를 지정해두는 방식이다.

PixelOut Deferred_PS(VertexIn pin)
{
	PixelOut pout;

	...
    
#ifdef TERRAIN_MESH
	float4 mask = float4(pin.MaskColor.rgb, 1.0f);
	mask.rg /= mask.r + mask.g;
    
	if (mask.r > 0.0f)
	{
		albedo.rgb += gDiffuseLayer1.Sample(gSamWrapLinear, pin.Tex).rgb * mask.r;
		normalColor += gNormalLayer1.Sample(gSamWrapLinear, pin.Tex).rgb* mask.r;
	}
	if (mask.g > 0.0f)
	{
		albedo.rgb += gDiffuseLayer2.Sample(gSamWrapLinear, pin.Tex).rgb * mask.g;
		normalColor += gNormalLayer2.Sample(gSamWrapLinear, pin.Tex).rgb* mask.g;
	}
    
	normalW = UnpackNormal(normalColor, pin.NormalW, pin.TangentW);
	normalV = UnpackNormal(normalColor, pin.NormalV, pin.TangentV);
#else
    
	...
    
	return pout;
}

- 위 Shader Code는 현재 프로젝트에서 사용중인 코드의 일부인데 위에서 설명한 것과 같이 해당 Pixel의 Mask Color 기준으로

   Texture Blending을 하는 과정이다.

 

Terrain Blending 적용 결과

 

적용 영상

Terrain Blending 적용 영상

 

'Graphics' 카테고리의 다른 글

[DirectX 11] Order Independent Transparency  (0) 2022.01.07
[DirectX 11] Particle System  (0) 2021.12.26
[DirectX 11] Map / UnMap vs UpdataSubresource  (0) 2021.12.19
[DirectX 11] Animation  (0) 2021.12.18
[DirectX 11] Skinning Mesh  (0) 2021.12.18
'Graphics' 카테고리의 다른 글
  • [DirectX 11] Order Independent Transparency
  • [DirectX 11] Particle System
  • [DirectX 11] Map / UnMap vs UpdataSubresource
  • [DirectX 11] Animation
KyuHwang
KyuHwang
  • KyuHwang
    DirectX Engine
    KyuHwang
  • 전체
    오늘
    어제
    • 분류 전체보기 (50)
      • C++ (4)
      • CS (0)
      • Graphics (32)
      • DLL (2)
      • Shader (7)
      • Project (4)
      • ETC (1)
  • 블로그 메뉴

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

    • YouTube
  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
KyuHwang
[DirectX 11] Terrain Mesh Blending
상단으로

티스토리툴바