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