【问题标题】:Optimizing drawing cube with multiple textures优化具有多个纹理的绘图立方体
【发布时间】:2015-10-09 16:17:59
【问题描述】:

我正在尝试优化绘制具有 3 种不同纹理的立方体。我想要达到的一个效果是:

我现在正在做的是使用三个 Draw() 调用来绘制立方体:

            graphicsDevice.Textures[0] = cube.frontTexture;
            graphicsDevice
                .DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0,
                    36, 0, 2);

            graphicsDevice.Textures[0] = cube.backTexture;
            graphicsDevice
                .DrawIndexedPrimitives(PrimitiveType.TriangleList, 6, 0,
                    30, 0, 2);

            graphicsDevice.Textures[0] = cube.sideTexture;
            graphicsDevice
                .DrawIndexedPrimitives(PrimitiveType.TriangleList, 12, 0,
                    24, 0, 8);

然后在像素着色器中处理我的纹理我对纹理进行采样:

texture Texture;
sampler textureSampler  : register(s0) = sampler_state {
    Texture = (Texture);
    Filter = MIN_MAG_MIP_POINT;
    AddressU = Wrap;
    AddressV = Wrap;
};

并产生输出:

return tex2D(textureSampler, texCoord);    // I have my texCoords from vertex shader output

不幸的是,在我的场景中有数百个具有不同纹理的相似立方体以及其他对象,这对 FPS 速率有不良影响。我注意到我可以在像素着色器中采样多个纹理:

        graphicsDevice.Textures[0] = cube.frontTexture;
        graphicsDevice.Textures[1] = cube.backTexture;
        graphicsDevice.Textures[2] = cube.sideTexture;

我能否以某种方式将每个纹理粘贴到像素着色器中长方体的正确面,以便在一次 Draw() 调用中绘制它?我使用 Silverlight 5.0,但任何关于 XNA 或 MonoGames 的答案都将不胜感激:)

【问题讨论】:

    标签: silverlight xna silverlight-5.0 monogame hlsl


    【解决方案1】:

    您可以获取构成 3 个纹理的所有 3 个位图并将它们添加到一个大位图。结果将是一个大纹理纹理图集。然后,您只需将每个面的 UV 设置为大纹理的适当部分。

    这样,只有一个绑定纹理,无需执行昂贵的纹理上下文切换。

    这是一种常见的做法。 sprite sheet 也很受欢迎。

    【讨论】:

    • 我想过这个问题,但我很伤心,我有很多像我这样的立方体已经完成了纹理。我现在无法全部更改。我试图做的是在 .NET 中使用 WritableBitmap 类创建一个大位图,但它在内存方面存在很大问题,我停止开发这个想法。
    • @bartosz.baczek 如果您打算使用着色器,那么您不应该在 CPU 端使用纹理,因为这会严重影响性能。您应该将所有纹理上传到 GPU,然后才在游戏开始时。避免每帧都上传。
    • @bartosz.baczek 有一些工具可以让您将位图打包到精灵表中,并为您提供每个位图的 UV。祝你好运!
    • 我想要它,但我很伤心,现在有数百甚至数千个纹理。我使用您的解决方案为时已晚。不过我很乐意这样做。
    【解决方案2】:

    正如@Micky 所说,使用精灵表而不是数千个单独的纹理是一种很好的做法。在我的情况下,我想在文件系统中有单独的纹理,但游戏中的纹理很少,所以我编写了特殊的类来在大精灵表中组合小纹理并重新计算纹理坐标。

    代码很多,最好提供link to sources

    游戏开始时的纹理包装。如果您不介意几秒钟的处理,您可以将其用于您的精灵。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 2012-11-24
      • 2014-05-06
      • 1970-01-01
      • 2020-08-19
      • 2018-07-29
      • 1970-01-01
      相关资源
      最近更新 更多