【问题标题】:Monogame Multiple Vertices TexturesMonogame 多顶点纹理
【发布时间】:2023-06-29 20:02:01
【问题描述】:

我正在尝试将 2D 游戏转换为 3D,但在纹理方面遇到了一些问题。整个游戏由立方体组成,所以我使用顶点来创建一个立方体并从 draw 方法中调用它。但是,我似乎只能使用基本效果为所有具有一种纹理的立方体着色。我想我需要使用其他类型的效果,所以我可以为每个立方体选择纹理,但不确定该怎么做。任何帮助表示赞赏

将使用如下循环在屏幕上绘制立方体。不知何故,每个立方体的纹理都不同

foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
{
  pass.Apply();

  for (int i=0;i<mapsize;i++)
  {
      vertices = createCubeTexture(-1.0f, 0.5f);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
  }
}

【问题讨论】:

  • 我们需要代码来更深入地评估问题。现在,听起来您只是在绘制与列表中存储的一样多的立方体。如果您不为绘制的每个立方体加载单独的纹理,这显然会成为一个问题。但是显示一些代码。
  • 添加了上面的代码,希望对您有所帮助

标签: c# xna monogame


【解决方案1】:

看看你的问题:

for (int i=0;i<mapsize;i++)
  {
      vertices = createCubeTexture(-1.0f, 0.5f);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
  }

每次遍历 mapsize(可能是 int)时,您都在循环遍历整个地图,创建一个带有纹理的立方体。这很好,但问题在于该方法将为所有立方体创建相同的纹理。你需要做的是这样的:

public class Cube
{
    public Vector3 Position { get; set; }
    public Texture2D Texture { get; set; }

    public Cube(Vector3 position, Texture2D texture)
    {
        Position = position;
        Texture = texture;
    }

    public void Draw(GraphicsDevice device)
    {
        var vertices = createCubeTexture(position);
        device.DrawUserPrimitives(PrimitiveType.TriangleList, vertices, 0, 2, VertexPositionTexture.VertexDeclaration);
    }
}

请注意,我已经有一段时间没有使用手动绘制立方体了,所以我不记得这是否是确切的方法,但如果不是,它非常相似。只需遍历每个立方体,然后调用 Draw 方法。

然后当您实例化立方体时,您会传递不同的纹理,具体取决于您正在创建的立方体:)

【讨论】:

  • 这是有道理的,所以我需要为每个纹理设置不同的效果,并且效果是否会分别为每个立方体一遍又一遍地传递?我认为有一种方法可以只使用一种效果但有多种纹理..
  • 在立方体外部实例化效果,并将其作为参考传递。这应该工作:)