arrays - 在 WebGL 的 GLSL 着色器中使用数组

标签 arrays textures opengl-es-2.0 glsl webgl

所以我正在尝试将一组值发送到我的片段着色器 - 着色器从纹理读取值,并根据纹理当前读取的值,我想从数组中检索一个值-

我可以使用 int(u.r) 将值 (u.r) 转换为 int,但是当我实际将其放入数组索引以查找值时,它说整数不是常量,所以我不能用...

  • 错误:0:75:'[]':索引表达式必须是常量 -

是否有更好的方法将值数组发送到着色器?

这是一些代码——如您所见,数组“tab”是我主要查看的内容

    <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;
   } 

...更多内容,但这是想法

最佳答案

片段着色器很棘手,不像顶点着色器,在顶点着色器中,您可以使用片段着色器中的任何整数表达式索引统一,表达式必须符合 const-index。这可以排除片段着色器循环中的索引制服:-\

GLSL ES Specification (version 100) - 附录 A:ES 2.0 的限制 - 第 110 页

Specification Excerpt

许多实现都超出了这些要求,但请理解片段着色器比顶点着色器更具限制性。如果您可以编辑您的问题以包含完整 片段着色器,我或许可以为您提供替代解决方案。

一种解决方案可能是使用一维纹理查找而不是数组。从技术上讲,使用非常量坐标的纹理查找是依赖查找,这可能会慢得多。然而,纹理查找确实克服了 GLSL ES 中数组索引的限制。

关于arrays - 在 WebGL 的 GLSL 着色器中使用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19755973/

相关文章:

javascript - Threejs 纹理(创建星际之门!)

c++ - 如何手动包装纹理坐标?

java - 比较两个数组的元素

ios - 初学者 : Storing Array Data in iOS

openGL 在像素传输期间反转纹理方向?

android - iOS/Android 回到 OpenGL 1.1 而不是使用 2.0

java - 如何检测纹理何时被破坏

ios - Opengl ES - 绘制多个对象的最佳方法是什么

c++ - 二维数组的输出元素

php - 将多级关联数组显示为表格