2017-11-09 60 views
0

私は計算をGPUに移そうとしているので、HLSLで大きな配列を定義する方法があります。HLSLで大きな次元の配列を定義するにはどうすればよいですか?

は、私は現在

struct Buffer 
{ 
    float3 image[640 * 480]; 
}; 

を持っているが、私はこれを分割して、CPUの上に戻ってそれらを一緒にマージする必要はありませんでした場合、それは素晴らしいことだエラーに

error X3059: array dimension must be between 1 and 65536 

を取得しています。

方法はありますか?

更新

コメントで述べたように、私は店を作成しようとしている配列は、データを画素として、それは、テクスチャとしてこのデータを保存するために、より理にかなって。私はTexture2DをHLSLファイルに定義しようとしましたが、データを編集したり、テクスチャファイルに書き込むことができません。

誰でもこれを行う方法を知っていますか?

+0

私はDirectX/HLSLについてよく分かりませんが、OpenGLではUniform Buffers(類似していると思われる)が記憶容量に似た制限を持っています。代わりに代用ストレージとしてテクスチャを使用することをお勧めします(これは最初から画像を表すオブジェクトであると思われるので当てはまりそうです)、またははるかに大きなサイズを持つ* Shader Storage Buffer *を使用してください。私は、Shader Storage BufferのDXバージョンが何であるかはわかりません。 – Xirema

+0

@Xiremaこれはもっと理にかなっています。 Texture2Dを使ってみましたが、シェーダーからピクセルデータを変更できないようです。おそらく私は何かを逃しています。 – user

+0

さて、OpenGLでは、バッファへの読み取りと書き込みの両方のアクセスが必要な場合はShader Storage Buffer *を使用する必要があります。一方、Uniform Buffersは読み取り専用の傾向があり、テクスチャはオブジェクトとしてシェーダを使用し、Texture添付ファイルでカスタムFramebufferをバインドする場合は、Fragment(Pixel、HLSL)シェーダの通常の出力の一部としてのみ書き込まれます。どちらのソリューションでもHLSLに相当するものが必要です。 – Xirema

答えて

0

解決方法が見つかりませんでしたが、画像データを操作しているので、RWTexture2D<float4>を使用して、読み取り書き込みアクセスを提供すると、達成したいことがうまく機能しているようです。

関連する問題