我正在尝试使用由多层材料组成的 3D 纹理来实现地形纹理,并在材料之间进行平滑混合。
也许我的插图会更好地解释它:
试想一下,每种颜色都是很酷的地形纹理,比如草、石头等。
我想让它们正确混合,但是用目前的方法,除了我想要出现的纹理之外,我还得到了请求之间的所有纹理(这似乎是合乎逻辑的,因为我读过,3D 纹理被视为三维数组而不是纹理柱)。
当前(显然是愚蠢的)方法很简单(“当前”结果是使用点插值渲染的,所需的结果是手绘的):
顶点:
Vertex 1: Position = Vector3.Zero, UVW = Vector3.Zero
Vertex 2: Position = Vector3(0, 1, 0), UVW = Vector3(0, 1, 0.75f)
Vertex 3: Position = Vector3(0, 0, 1), UVW = Vector3(1, 0, 1)
如您所见,三角形的第一个顶点使用第一种材质(红色的),第二个顶点使用第三种材质(蓝色的),第三个顶点使用最后的第四种材质(黄色的)。
这就是它在像素着色器中的完成方式(UVW 直接传递而无需更改):
float3 texColor = tex3D(ColorTextureSampler, input.UVW);
return float4(texColor, 1);
我选择的原因是我的地形结构。地形是使用行进立方体从体素(每个体素都有材质 ID)生成的。每个顶点都是“焊接的”,因为网格非常大,我不想让每个三角形都独立(但如果无法使用连接顶点解决我的问题,我仍然可以这样做)。
我最近想到了在每个顶点中存储三角形其他两个顶点的材质 ID 及其混合因子(我会有一个 float2 UV 对,float3 用于材质 ID,float3 用于每个材质 ID 的混合因子),但我如果不将我的网格分成单独的三角形,则看不到任何方法来实现这一点。
任何帮助将不胜感激。我的目标是使用 C# 和 Direct3D 9 API 的 SlimDX。谢谢阅读。
PS:如果我在这篇文章中犯了一些错误,我很抱歉,英语不是我的母语。