【问题标题】:How to unset texture data in XNA 4.0如何在 XNA 4.0 中取消设置纹理数据
【发布时间】:2011-11-16 16:08:05
【问题描述】:

我需要将一些不断变化的数据传递给我的像素着色器。我有一个通过纹理参数传递给我的像素着色器的 texture2d。在调用着色器之前,我需要更新纹理中的数据。

        emittingPositions.SetData(emittingPositionsBuffer); //Set the data on the texture
        animationEffect.Parameters["emittersMap"].SetValue(emittingPositions); //Tell the shader about the texture data
        //go on to do the actual drawing calls to use the pixel shader

问题是当我这样做时会出现异常:

“当资源在 GraphicsDevice 上主动设置时,您不能在资源上调用 SetData。在调用 SetData 之前从设备取消设置它。”

如何“从设备中取消设置”?还是我应该在这里采取不同的方法?

【问题讨论】:

  • 哪一行触发了异常?
  • 第二行调用.SetValue

标签: xna-4.0 pixel-shader


【解决方案1】:

第一个纹理设置在 GraphicsDevice.Textures 数组中,索引为 0。

所以你必须这样做:

 GraphicsDevice.Textures[0] = null;

【讨论】:

  • 你怎么知道你正在取消设置正确的纹理?如果我通过 SetData 将多个纹理传递给图形设备会怎样——我如何知道我需要使用哪个索引来取消设置特定纹理?
  • 这真的很奇怪——在进一步的实验中——纹理 0 是所有需要设置为 null 的东西——无论您实际需要更新哪个纹理。这是为什么呢?
  • 当然要看你使用的shader,xna默认提供的shader是BasicEffect shader,它只使用寄存器s0中的一个纹理,也就是第一个纹理。您可以创建自己的着色器并为您的纹理使用其他寄存器(s1、s2、...)以避免冲突
  • 我正在使用我自己的着色器和多个extern Texture2Ds,以及多个extern sampler2Ds;不管我使用哪种纹理,设置Textures[0] = null; 可以让我可以在其中任何一个上设置SetData(否则,如果我在其中任何一个上调用SetData,我会得到上面提到的异常)——我猜纹理是收藏收藏?为什么有多个纹理集合?你如何选择你的纹理进入哪个集合?我在哪里可以了解更多信息?
猜你喜欢
  • 1970-01-01
  • 2013-08-06
  • 2012-01-24
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多