【问题标题】:How do I plot individual pixels using the XNA APIs?如何使用 XNA API 绘制单个像素?
【发布时间】:2010-12-23 10:20:04
【问题描述】:

如果我想用单独颜色的像素填充我的游戏屏幕,我该怎么做?

例如,如果我想编写一个“game of life”类型的游戏,其中每个像素都是一个单元格,我将如何使用 XNA 来实现?

我尝试使用屏幕大小的Color 值数组在Texture2D 对象上调用SetData(),但它抱怨:

您不能在 GraphicsDevice 上主动设置资源时调用 SetData。

在调用 SetData 之前从设备中取消设置。

我该怎么做?或者更好……有没有替代的、更好的、有效的方法来用任意像素填充屏幕?

【问题讨论】:

  • 为什么不使用原始 DirectX 或 OpenGL?
  • 说实话?因为我实际上只是在用 C# 来处理图形,而且我一生都无法弄清楚托管 DirectX API 可以在微软网站上的什么地方下载。想想我下载了大约 4 个不同版本的 SDK……没有找到 C# 参考。如果我能找到它,我会改用它,但 XNA 维基百科页面说它取代了托管 DX API,所以在那之后我放弃了。

标签: performance graphics xna pixels


【解决方案1】:

关于您遇到的错误,这意味着您正在尝试修改纹理数据,而它仍然绑定到设备上的采样器单元之一。您是在 SpriteBatch.Begin/End 块内调用 SetData 吗?如果是,那就是问题所在(在进行任何绘图之前更新您的纹理)。否则,您是否使用 GraphicsDevice.Textures[x] = yourTexture 直接在设备的纹理采样器之一上设置纹理?如果是,请在开始更改数据之前将 Textures[x] 设置为 null。

就您所做工作的效率而言,它并不理想,但对您的目的而言可能并不重要。尽量保持合理的图像分辨率,并意识到使用这种方法可能无法达到 200 FPS,但我会尝试一下,看看它是否足够快,然后再开始担心性能。

【讨论】:

  • 什么是更理想的方法?
【解决方案2】:

在 Texture2D 上设置数据后,您无法再更改它。解决这个问题的方法是创建一个 1x1 Texture2D 并将其颜色设置为白色。然后,您将使用您希望像素为什么颜色的色调来绘制它。由于您的纹理是白色的,因此所需的颜色将完美地呈现您选择的颜色。

Texture2D pixel = new Texture2D(App.GraphicsDevice, 1, 1);
colors = new Color[1];
colors[0] = Color.White;
pixel.SetData(colors);

这是一个使用上方像素绘制像素的示例函数。

public void DrawPixel(SpriteBatch spriteBatch, Vector2 pos, Color tint)
{
    spriteBatch.Draw(pixel, pos, tint);
}

为每个像素绘制重复使用这个 Texture2D。

【讨论】:

    【解决方案3】:

    最理想的方法是让你的着色器为你做这件事。在只使用着色器之前,我已经实现了一个模拟人生的游戏,其他人也用 XNA http://www.xnainfo.com/content.php?content=21 做了同样的事情。

    这个想法是使用两种纹理,一种用于旧状态,一种用于新状态。设置它,以便渲染到新纹理并从旧纹理中读取。您可以直接在着色器中进行细胞自治:)。

    您可以获得出色的性能,使用 1024x1024 网格时,我的速度约为 300fps。

    【讨论】:

      【解决方案4】:

      您可以使用我提到的技术here 使用 SpriteBatch 绘制矩形。然后,您可以使用它来绘制覆盖屏幕的 1x1 矩形。我不知道它的性能如何,但它应该可以工作。

      这个App Hub post 似乎在谈论您要解决的确切问题。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2021-12-29
        • 2012-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-01
        • 2016-05-28
        相关资源
        最近更新 更多