1

这是我第一次来这里(有一个帐户),我希望用 XNA 4.0 制作一个高度图编辑器(如果你玩过的话,有点类似于 Earth2150)。

我在这里写了一个自定义效果文件:http: //pastebin.com/CUFtB8Z9

它很好地融合了纹理,除了它融合了整个地图。

我真正想要的是能够在我的高度图上有多个纹理(然后我将与最近的其他纹理混合),我正在寻找方法来做到这一点。

我考虑过float在我的顶点声明中分配一个,然后使用纹理数组将纹理“分配”到特定顶点。但是我将如何让我的效果文件为每个顶点上的纹理获取不同的值?

抱歉不是很清楚,这是我的绘制代码和顶点声明:

(请原谅随机数的变化,这是我尝试让每个顶点选择随机纹理的尝试)

public void Draw(Texture2D[] TextureArray)
{
    RasterizerState rs = new RasterizerState();
    rs.CullMode = CullMode.None;
    //rs.FillMode = FillMode.WireFrame;
    EditGame.Instance.GraphicsDevice.RasterizerState = rs;
    Random rnd = new Random();

    foreach (EffectPass pass in EditGame.Instance.baseEffect.CurrentTechnique.Passes)
    {
        if (SlowCounter == 60)
        {
            EditGame.Instance.baseEffect.Parameters["xTexture"].SetValue(TextureArray[rnd.Next(0, 2)]);
            EditGame.Instance.baseEffect.Parameters["bTexture"].SetValue(TextureArray[rnd.Next(0, 2)]);
            SlowCounter = 0;
        }

        pass.Apply();
        EditGame.Instance.GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, vertices, 0, vertices.Length, indices, 0, indices.Length / 3, VP2TC.VertexDeclaration);
    }
    SlowCounter++;
}

public readonly static VertexDeclaration VertexDeclaration = new VertexDeclaration(
    new VertexElement(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
    new VertexElement(12, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate,0),
    new VertexElement(20, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate,1),
    new VertexElement(28, VertexElementFormat.Single, VertexElementUsage.BlendWeight,0),
    new VertexElement(32, VertexElementFormat.Vector3,VertexElementUsage.Normal,0),
    new VertexElement(44, VertexElementFormat.Color,VertexElementUsage.Color,0)
);
4

1 回答 1

1

正如我在评论中所说,我不确定这是否是您要寻找的东西,但无论如何我都会继续。

我想你可能想要的描述在这里

本质上,您有一个向量 4,它存储每个纹理的权重,然后对向量中的各个元素加权的所有 4 个纹理进行加权平均(充当 4 个混合权重)。

如果您想混合纹理而不必为每个纹理都添加一个混合元素,那么事情会变得更有趣。

您可以有一个混合权重,它基本上按顺序选择 2 个相邻纹理的混合。因此,如果您有:

  1. 岩石

混合权重 = 0.5

会选择草 (0.25) 和岩石 (0.75) 的混合物。以等量混合(因为它在它们之间)。

如果你想要很多纹理,你的着色器会变得非常麻烦,大约 50 个纹理采样器。如果你真的想要这么多纹理,你应该考虑一个纹理图集 ,或者只是程序生成的虚拟纹理,在生成时已经完成了混合。

于 2012-11-18T20:57:46.030 回答