Terrain Mesh Blending
- 현재 프로젝트 진행중 Unreal Data를 이용하여 Terrian Material Layer 들의 Mask Image와 각각의 Material Texture을
이용하여 Texture Blending을 한다.
- 현재 프로젝트에서 사용하고있는 Terrian Layer는 두개를 사용하기에 R, G Channel 만 이용.
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을 하는 과정이다.
적용 영상
'DirectX 11' 카테고리의 다른 글
[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 |