Top > ComputerGraphics > HLSL > Common > ProblemAtInitializeArray
Last-modified: Sun, 08 Jul 2012 11:19:26 JST
Counter:3027 Today:1 Yesterday:2 Online:4
このエントリーをはてなブックマークに追加

(注意) 記事を引っ越しました

HLSLで配列を初期化する際に生じる問題

About

検証したシェーダモデル(Version)は2_0,3_0です。シェーダモデルが上がれば或いは解決しているかもしれません。

 配列を初期化しようとして失敗するパターンがある。コンパイルエラー分には次の様に表記される。

error X3058: array dimensions must be literal scalar expressions

 要するに、配列を初期化する場合は、リテラル(固定値:定数)なスカラ型(通常はint)で行いなさいというエラーになっている。失敗するパターンは例えば次の様な場合になる。

int ArrayCount = 50;//エラーが起きる
static int ArrayCount = 50;//エラーが起きる
const int ArrayCount = 50;//エラーが起きる
uniform int ArrayCount = 50;//エラーが起きる
static const int ArrayCount = 50;//エラーは起きない

float4 PixelShaderFunction() : COLOR0
{
    int array[50];//問題なくコンパイルされる
    int array[ArrayCount];//エラーが起きる場合がある
…
}

 御覧の通り、「static const」の場合のみコンパイルが通る。つまり外部参照が不可で、これらの値をCPU側から設定して、実行の度に動的に変更する、といった処理を行うことはできない。

  • static
    • 通常のプログラミングで言う所のprivate
  • shared
    • 通常のプログラミングで言う所のstatic
  • extern(デフォルト)
    • 通常のプログラミングで言う所のpublic

References