HLSL:返回一个float4数组?

问题描述 投票:1回答:2

我在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
2个回答
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 :)


0
投票

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

Olhovsky所说的是真的,如果你从c转换为直接c / compute你应该将迭代作为单独的线程进行布局,但是不要忘记gpu也有很多系列功能,你需要把它考虑到您的预算以实现最高效率。例如,您需要的线程数量最少是您的GPU上的核心数量。对于gtx980,它的2048。

© www.soinside.com 2019 - 2024. All rights reserved.