HLSL:返回一个float4数组?

时间:2011-04-15 08:56:32

标签: c# c++ xna hlsl

我在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 []的返回类型。我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

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

HLSL代码在每个顶点(在顶点着色器中)或每个像素(在像素着色器中)执行。因此,对于您为GPU提供的每个顶点,都将执行此代码。

这个HLSL介绍应该让你了解如何在每个像素上执行几行HLSL代码,从输入产生一个新图像:

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

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

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

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

答案 1 :(得分:0)

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

Olhovsky所说的是正确的,如果您从c转换为直接c / compute,则应将迭代布置为单独的线程,但是请不要忘记gpu也具有很多系列功能,您需要考虑到您的预算以实现最大效率。例如,您需要的最少线程数是gpu上的内核数。对于gtx980,则为2048。