【发布时间】:2011-06-17 18:31:50
【问题描述】:
我正在尝试使用 XNA 逐个像素地在屏幕上绘图,但我遇到了资源问题。我认为最好的方法是让每帧更新 1 个纹理,但我无法更新它。这是我目前得到的,只是作为一个测试:
Texture2D canvas;
Rectangle tracedSize;
UInt32[] pixels;
protected override void Initialize()
{
tracedSize = GraphicsDevice.PresentationParameters.Bounds;
canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color);
pixels = new UInt32[tracedSize.Width * tracedSize.Height];
base.Initialize();
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
pixels[100] = 0xFF00FF00;
canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height);
spriteBatch.Begin();
spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
第二次调用 Draw() 时,出现以下错误:
“操作已中止。您不能修改已在设备上设置的资源,或在平铺括号内使用后的资源。”
如果我尝试在 Draw() 中创建一个新的 Texture2D,我很快就会遇到内存不足的错误。这适用于 Windows Phone。看来我正在尝试以错误的方式进行操作,我还有哪些其他选择才能使其正常工作?
【问题讨论】:
-
我不知道答案,所以我用谷歌搜索了“xna 程序纹理”(这就是这种东西的名称)。似乎没有一种简单的内置方法可以做到这一点。至少有三个常见的建议(缓冲、GPU 纹理命令、在着色器中执行)。最后一个显然是最优的,但需要着色器编程知识。您可能希望执行相同的搜索并浏览那里的内容。
-
对于希望逐个像素地动态绘制 2D 纹理的人,这里已经回答了 stackoverflow.com/questions/70022699/…