3

だから私は値の配列をフラグメントシェーダーに送信しようとしています-シェーダーはテクスチャから値を読み取り、現在テクスチャによって読み取られている値に応じて、配列から値を取得したい-

int(ur) を使用して値 (ur) を int にキャストすることはできますが、実際にそれを配列インデックスに入れて値を見つけると、整数は定数ではないと言われるので、できませんこれを使って...

  • エラー: 0:75: '[]': インデックス式は定数でなければなりません -

値の配列をシェーダーに送信するより良い方法はありますか?

これがコードの一部です。ご覧のとおり、配列「タブ」は私が主に見ているものです

    <script id="shader-fs" type="x-shader/x-fragment">


#ifdef GL_ES

precision highp float;

#endif

  uniform sampler2D uTexSamp;

uniform sampler2D uTabSamp;
  uniform float dt;
  uniform float dte;
  uniform float dth2;
  uniform float a;
  uniform float nb;
  uniform float m;
  uniform float eps;
    uniform float weee;

 uniform float tab[100];


    //uniform float temp;

  uniform int fframes;
  uniform vec2 vStimCoord;
  varying vec2 vTexCoord;

  const float d = 0.001953125; // 1./512.

void main(void) {

   vec4 t = texture2D(uTexSamp, vTexCoord);
   float u = t.r,  v = t.g,  u2 = t.b,  v2 = t.a;


    //const mediump int arrindex = floor(u*10 + u2);
    //float sigvaluetab = tab[arrindex];

    u += u2/255.;   v += v2/255.;

   //u += u2 * 0.003921568627451;
   v += v2 * 0.003921568627451;

   //Scaling factors
   v = v*1.2;
   u = u*4.;


   float temp =  (1.0 / (exp(2.0 * (u-3.0)) + 1.0)); // (1-tanh(u-3)) * 0.5



    //const mediump int utoint;
    //utoint = int(u);
    //for(int index = 0; index< 50; index++)

    int u2toint;
    u2toint = int(u2);

  //  int arrindex = utoint*10 + u2toint;
    float sigmoid = tab[u2toint];//(tab[5] + 1.);
    //float sigmoid= temp;//tab[arrindex];

   float hfunc   = sigmoid * u * u;
   float ffunc   = -u +(a - pow(v*nb,m))*hfunc ;

   float gfunc = -v;
   if (u  > 1.0) {   //u-1.0 > 0.0
       gfunc += 1.4990;
   } 

... 下のその他の要素ですが、これがアイデアです

4

1 に答える 1

2

フラグメント シェーダーは扱いが難しく、フラグメント シェーダーで任意の整数式を使用して均一にインデックスを付けることができる頂点シェーダーとは異なり、式は として修飾する必要がありconst-indexます。これは、フラグメント シェーダーのループ内のインデックス ユニフォームを除外するところまで行くことができます:-\

        GLSL ES 仕様 (バージョン 100) - 付録 A: ES 2.0 の制限 - pp. 110

                       仕様抜粋

多くの実装はこれらの要件を超えていますが、フラグメント シェーダーは頂点シェーダーよりも制限が厳しいことを理解してください。質問を編集して完全なフラグメント シェーダーを含めることができれば、別の解決策を提供できるかもしれません。

解決策の 1 つは、配列の代わりに 1D テクスチャ ルックアップを使用することです。技術的には、非 const 座標を使用するテクスチャ ルックアップは依存ルックアップであり、大幅に遅くなる可能性があります。ただし、テクスチャ ルックアップは、GLSL ES の配列インデックスの制限を克服します。

于 2013-11-03T23:22:53.143 に答える