【发布时间】:2011-04-18 03:26:48
【问题描述】:
我为自己接受了相当艰巨的挑战。在我的 XNA 游戏中,我想实现Blargg's NTSC filter。这是一个 C 库,可以转换位图,使其看起来像是在具有 NTSC 标准的 CRT 电视上输出的。非常准确,真的。
不久前我尝试的第一件事是通过将 C 库本身调用为 dll 来使用它。这里我遇到了两个问题,1.我无法正确复制一些数据,因此图像混乱,但更重要的是,2.它非常慢。它需要获取 XNA Texture2D 位图数据,将其通过过滤器,然后再次将数据设置为纹理。帧率被破坏了,所以我不能走这条路。
现在我正在尝试将过滤器转换为像素着色器。这里的问题(如果你喜欢看代码——我使用 SNES 是因为它最简单)是它处理非常大的数组,并且依赖于有趣的指针操作。正如像素着色器所需要的那样,我已经做了很多工作来重写算法以使每个像素独立工作。但我不知道这是否会奏效。我来找你看看能不能完成这个。
- 涉及包含 1,048,576 个整数的预先计算的数组。仅此一项就超出了像素着色器的任何限制吗?它只需要设置一次,而不是每帧一次。
- 即使没关系,我知道 HLSL 不能通过变量索引数组。它必须将其展开为一百万个 if 语句才能获得正确的数组元素。这会扼杀表演并使其再次成为徒劳的努力吗?每个像素有多个数组访问。
- 我原来使用图书馆的计划有可能可行吗?我只需要它快。
- 我以前从未编写过着色器。还有什么我需要注意的吗?
编辑:#2 的附录。我刚刚在某处读到,hlsl 不仅不能通过变量访问数组,而且即使展开它,索引也必须在编译时可计算。这是真的,还是“展开”解决了这个问题?如果是真的,我想我完蛋了。有什么办法吗?我的算法基本上是“输入像素是这种颜色,所以在这个巨大的数组中查找我的输出像素值”的美化版本。
【问题讨论】: