2

フラグメントシェーダー内の変数の値を変更することは禁止されていますか? 新しい値を "doseValue" に設定しようとすると、次のコードが正確にクラッシュします。

const GLchar *point_fragment_shader =
"#version 420\n"
""
"/* Per Fragment Input Attributes */"
"in float doseValue;"
"in float alphaValue;"
"in vec2  displayUncertaintyByChangedColor;"
""
"/* Uniform Attributes */"
"uniform float minDisplayDoseValue;"
"uniform int   pointVisualizationMode;"
""
"/* Per Fragment Output Values */"
"out vec4 out_color;"
""
"void main()"
"{"
"   "
"   /* Discard all Points whose dose value is below the minimum */"
"   if(doseValue < minDisplayDoseValue)"
"   {"
"       discard;"
"   }"
"   else"
"   {"
"       if(displayUncertaintyByChangedColor.x == 1.0)"
"       {"
"           doseValue = 500.0;"
"       }"
" ..."

vec2 内では、最初のコンポーネントは 0.0 または 1.0 で、2 番目のコンポーネントは浮動小数点数です。新しい変数を設定し、2 番目の if ステートメント内で任意の値で初期化すると、エラーは発生しません。

4

1 に答える 1

5

GLSL 4.20 仕様、ページ 38、セクション 4.3.4: 入力変数:

シェーダー入力変数は、ストレージ修飾子in で宣言されます。これらは、OpenGL パイプラインの前のステージと宣言シェーダーの間の入力インターフェイスを形成します。入力変数は、グローバル スコープで宣言する必要があります。前のパイプライン ステージからの値は、シェーダー実行の開始時に入力変数にコピーされます。入力として宣言された変数は、シェーダーの実行中に書き込むことはできません。

于 2013-01-31T15:30:59.183 に答える