2011-04-15 87 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