【问题标题】:HLSL: Returning an array of float4?HLSL:返回一个 float4 数组?
【发布时间】:2011-04-15 08:56:31
【问题描述】:

我在 HLSL 中有以下功能:

float4[] GetAllTiles(float type) {
    float4 tiles[128];
    int i=0;

    [unroll(32768)] for(int x=0;x<MapWidth;x++) {
        [unroll(32768)] for(int y=0;y<MapHeight;y++) {

            float2 coordinate = float2(x,y);
            float4 entry = tex2D(MapLayoutSampler, coordinate);
            float entryType=GetTileType(entry);
            if(entryType == type) {
                tiles[i++]=entry;
            }

        }
    }

    return tiles;
}

但是,它说它不能定义 float4[] 的返回类型。我该怎么做?

【问题讨论】:

    标签: c# c++ xna hlsl


    【解决方案1】:

    简而言之: 您不能返回在 HLSL 中的函数中定义的浮点数组。

    HLSL 代码(在 GPU 上)与 CPU 上的 C 代码不同。它在许多 GPU 内核上同时执行。

    HLSL 代码在每个顶点(在顶点着色器中)或每个像素处(在像素着色器中)执行。所以对于你给GPU的每个顶点,这段代码都会被执行。

    此 HLSL 介绍应该让您了解如何在每个像素上执行几行 HLSL 代码,从而从输入生成新图像:

    http://www.neatware.com/lbstudio/web/hlsl.html

    在您的示例代码中,您正在遍历整个地图,这可能根本不是您想要做的,因为您发布的函数将在输入中给出的每个像素(或顶点)处执行。

    通过 HLSL 代码将您的逻辑从 CPU 传输到 GPU 可能非常困难,因为 GPU 目前不是为进行通用计算而设计的。您尝试执行的任务必须非常并行,如果您希望它在 GPU 上快速运行,那么您需要通过绘制图像和读取纹理来表达问题。

    阅读我链接的教程以开始使用 HLSL :)

    【讨论】:

    • 可能在计算着色器中。
    • XNA没有,只支持shader model 3
    【解决方案2】:

    返回一个包含数组的结构。您可以将参数作为原始数组发送,但如果它的返回值,它必须在一个结构中。 :)

    Olhovsky 说的是真的,如果你从 c 转换为直接 c/compute,你应该将迭代布置为单独的线程,但不要忘记 gpu 也有很多串联能力,你需要考虑到您的预算以实现最大效率。例如,您需要的最少线程数是 gpu 上的内核数。对于 gtx980,它是 2048。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-11-24
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多