【发布时间】:2013-05-07 20:01:27
【问题描述】:
我正在尝试使用由多层材质组成的 3D 纹理来实现地形纹理,并在材质之间进行平滑混合。
也许我的插图会更好地解释它:
想象一下,每种颜色都是很酷的地形纹理,比如草、石头等。
我想让它们正确混合,但是通过目前的方法,除了我想要出现的纹理之外,我还获得了请求之间的所有纹理(这似乎是合乎逻辑的,因为正如我所读到的,3D 纹理被视为三维数组而不是纹理柱).
当前(显然是愚蠢的)方法很简单(“当前”结果是使用点插值渲染的,所需的结果是手绘的):
顶点:Vertex 1: Position = Vector3.Zero, UVW = Vector3.ZeroVertex 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。感谢阅读。
P.S.:如果我在这篇文章中出现了一些错误,我很抱歉,英语不是我的母语。
【问题讨论】:
标签: directx textures hlsl texture-mapping volume-rendering