【问题标题】:XNA - Copies of Same Source ModelXNA - 相同源模型的副本
【发布时间】:2013-08-21 20:54:10
【问题描述】:

如果我这样做:

Model test1 = content.Load<Model>(@"Models/floorTile");
Model test2 = content.Load<Model>(@"Models/floorTile");
Model test3 = content.Load<Model>(@"Models/floorTile");

foreach (ModelMesh mesh in test1.Meshes)
    foreach (Effect effect in mesh.Effects)
        ((BasicEffect)effect).DiffuseColor = Color.Red.ToVector3();

所有三个模型都将被分配红色,而不仅仅是 test1。

这是我的问题的简化版本,在实际版本中,我使用的是实际的 HLSL 效果,虽然我知道如何克隆单个效果以在多个唯一 fbx 上工作,但我不确定如何创建更多而不是一个 3dmodel 实例,并为每个实例分配它自己的纹理,而不是它们都引用一个纹理/效果,因此我场景中的每个“floorTile”看起来总是一样的。

我能想到的唯一解决方法是为每个模型创建不同的地砖 fbx 模型,但我有很多地砖,所以这远非理想。

【问题讨论】:

    标签: c# reference xna instance 3d-model


    【解决方案1】:

    我能想到的唯一解决方案是这样的:

    foreach (var mesh in Model.Meshes)
    {
       foreach (BasicEffect effect in mesh.Effects)
       {
           effect.EnableDefaultLighting();
           effect.TextureEnabled = true;
           effect.Texture = modelTexture;
           effect.Projection = Camera.Projection;
           effect.View = Camera.View;
           effect.World = AbsoluteBoneTransforms[mesh.ParentBone.Index] * FinalWorldTransforms;
        }
        mesh.Draw();
    }
    

    您可以有多个Model(如Model1、Model2 和Model3)和不同的modelTexture 来申请它们。
    如您所见,这使用了BasicEffect,我不知道如果您使用的是HLSL,它是否有用。

    【讨论】:

    • 谢谢,我想我明白你在说什么了,它可以在没有 BasicEffects 的情况下工作,确实在每次绘制调用中,我可以交换颜色并为同一模型获得不同的颜色,但是如果我有 30 个正方形并且都是不同的颜色,这意味着我必须在每次绘制调用中交换纹理 30 次,即使正方形的实际颜色永远不会改变颜色。我希望还有比这更好的方法。
    • 我希望如此,但我在 3D 和效果方面没有太多经验可以帮助您。
    • 纹理交换不如你在一帧中执行 30 次绘制调用这一事实相关,当你可以组合它们时。不过,这需要优化您构建场景的方式。如果没有额外的优化,此解决方案是执行此类操作的标准方法:您通常不会复制整个模型,而只是以不同的方式绘制它。
    • 真的吗?在 Draw 中似乎有很多工作,如果我有 30 个不同的 fbx 模型,我可以在创建时为它们分配一个纹理,那么我的绘制将只是 (foreach model) draw();,但由于它们是相同的模型,你'是说我必须通过并在每帧中交换纹理 30 次,即使场景中实际上并没有改变纹理?
    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多