【问题标题】:Translating C to C# and HLSL: will this be possible?将 C 转换为 C# 和 HLSL:这可能吗?
【发布时间】:2011-04-18 03:26:48
【问题描述】:

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

不久前我尝试的第一件事是通过将 C 库本身调用为 dll 来使用它。这里我遇到了两个问题,1.我无法正确复制一些数据,因此图像混乱,但更重要的是,2.它非常慢。它需要获取 XNA Texture2D 位图数据,将其通过过滤器,然后再次将数据设置为纹理。帧率被破坏了,所以我不能走这条路。

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

  1. 涉及包含 1,048,576 个整数的预先计算的数组。仅此一项就超出了像素着色器的任何限制吗?它只需要设置一次,而不是每帧一次。
  2. 即使没关系,我知道 HLSL 不能通过变量索引数组。它必须将其展开为一百万个 if 语句才能获得正确的数组元素。这会扼杀表演并使其再次成为徒劳的努力吗?每个像素有多个数组访问。
  3. 我原来使用图书馆的计划有可能可行吗?我只需要它快。
  4. 我以前从未编写过着色器。还有什么我需要注意的吗?

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

【问题讨论】:

    标签: c# c xna hlsl


    【解决方案1】:

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

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

    【讨论】:

    • 那么我可以将纹理用作数组吗?你能详细说明一下吗?我的巨型阵列不是直接的像素数据。这只是数字,我不确定它们代表什么。输出像素是通过将此数组中的一堆值相加,将其固定,然后使用某些公式将其转换为 rgb 来找到的。
    • 纹理本身不就是一个数字数组吗?因此,您可以将其用作着色器中的排序数组。
    猜你喜欢
    • 2012-10-13
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-21
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多