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

Tes*_*rex 7 c c# xna hlsl

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

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

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

  1. 涉及预先计算的数组包含1,048,576个整数.这是否超出了像素着色器的任何限制?它只需要设置一次,而不是每帧一次.
  2. 即使这没关系,我知道HLSL不能通过变量索引数组.它必须将它展开为一百万个if语句才能获得正确的数组元素.这会破坏性能并使其再次成为毫无结果的努力吗?每个像素有多个阵列访问.
  3. 我的原始计划是否有可能使用图书馆?我只需要快速.
  4. 我以前从未写过一个着色器.还有什么我应该知道的吗?

编辑:#2的附录.我刚读到某个地方不仅hlsl不能通过变量访问数组,而且即使要展开它,索引也必须在编译时计算.这是真的,还是"展开"解决了这个问题?如果这是真的,我想我搞砸了.有什么方法吗?我的算法基本上是一个美化版本的"输入像素是这种颜色,所以在这个巨大的数组中查找我的输出像素值."

Eup*_*ric 2

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

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