2011-04-15 23 views
1

我在HLSL以下功能:HLSL:返回一个float4数组?

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

简而言之: 您无法返回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

可以在Compute着色器中。 – Puppy 2011-04-15 09:33:03

+0

不在XNA中,它只支持着色器模型3 – MattDavey 2011-04-15 12:11:00