将C转换为C#和HLSL:这可能吗?

时间:2011-04-18 03:26:48

标签: c# c xna hlsl

我为自己承担了相当艰巨的挑战。在我的XNA游戏中,我想实现Blargg's NTSC filter。这是一个C库,它转换位图使其看起来像是在具有NTSC标准的CRT电视上输出的。这真的很准确。

我回过头来尝试的第一件事就是通过将其称为dll来使用C库本身。在这里,我有两个问题,1。我无法正确复制一些数据,因此图像搞砸了,但更重要的是,2。它非常慢。它需要获取XNA Texture2D位图数据,将其传递给过滤器,然后再次将数据设置为纹理。帧率被破坏了,所以我不能沿着这条路走下去。

现在我正在尝试将过滤器转换为像素着色器。这里的问题(如果你喜欢看代码 - 我正在使用SNES,因为它是最简单的)是它处理非常大的数组,并依赖于有趣的指针操作。我已经做了很多工作,重写算法以按像素独立工作,就像像素着色器需要的那样。但我不知道这是否会奏效。我来找你,看看是否有可能完成这项工作。

  1. 包含1,048,576个整数的预先计算的数组。这是否超出了像素着色器的任何限制?它只需要设置一次,而不是每帧一次。
  2. 即使没关系,我知道HLSL无法通过变量索引数组。它必须将它展开为一百万个if语句才能获得正确的数组元素。这会破坏性能并使其再次成为毫无结果的努力吗?每个像素有多个数组访问。
  3. 我的原始计划是否有可能使用图书馆?我只是需要快速。
  4. 我以前从未写过一个着色器。还有什么我应该知道的吗?
  5. 编辑:#2的附录。我刚读到某个地方不仅hlsl不能通过变量访问数组,而且即使要展开它,索引也必须在编译时计算。这是真的,还是“展开”解决了这个问题?如果这是真的,我想我搞砸了。有什么方法吗?我的算法基本上是一个美化版本的“输入像素是这种颜色,所以在这个巨大的数组中查找我的输出像素值。”

1 个答案:

答案 0 :(得分:2)

根据我对Shader语言的有限理解,通过使用纹理而不是数组可以轻松解决问题。

  1. 在CPU上预生成然后另存为纹理。在你的情况下1024x1024。
  2. 使用标准纹理访问函数,就像纹理是数组一样。可以使用最近邻来限制单个像素的混合。
  3. 如果你想要速度,我不认为这是可能的。