我在 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[] 的返回类型。我该怎么做?
最佳答案
简而言之: 您不能返回在 HLSL 中的函数中定义的 float 组。
HLSL 代码(在 GPU 上)不像 CPU 上的 C 代码。它在许多 GPU 内核上并发执行。
HLSL 代码在每个顶点(在顶点着色器中)或每个像素(在像素着色器中)执行。因此,对于您提供给 GPU 的每个顶点,都会执行此代码。
这个 HLSL 介绍应该让您了解如何在每个像素上执行几行 HLSL 代码,从而从输入生成新图像:
http://www.neatware.com/lbstudio/web/hlsl.html
在您的示例代码中,您正在遍历整个 map ,这可能根本不是您想做的,因为您发布的函数将在输入中给定的每个像素(或顶点)处执行。
通过 HLSL 代码将您的逻辑从 CPU 传输到 GPU 可能非常困难,因为 GPU 目前并非设计用于进行通用计算。您尝试执行的任务必须非常并行,如果您希望它在 GPU 上运行得很快,那么您需要通过绘制图像和读取纹理来表达问题。
阅读我链接的教程以开始使用 HLSL :)
关于c# - HLSL:返回一个 float4 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5674459/