所以我正在尝试将一组值发送到我的片段着色器 - 着色器从纹理中读取值,并根据纹理当前正在读取的值,我想从数组中检索值 -
我能够使用int(ur)将值(ur)转换为int,但是当我实际将它放入数组索引中以找到值时,它表示整数不是常量,所以我不能用它......
是否有更好的方法将值数组发送到着色器?
以下是一些代码 - 正如您所看到的,数组“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;
}
......更多的东西,但这是想法
答案 0 :(得分:2)
碎片着色器很棘手,与顶点着色器不同,您可以使用片段着色器中的任何整数表达式索引统一,表达式必须符合const-index
的条件。这可以排除在片段着色器中循环索引制服: - \
许多实现超出了这些要求,但了解片段着色器比顶点着色器更具限制性。如果您可以编辑问题以包含 完整 片段着色器,我可能会为您提供备用解决方案。
一种解决方案可能是使用一维纹理查找而不是数组。从技术上讲,使用非const坐标的纹理查找是相关查找,这可能会明显变慢。但是,纹理查找确实克服了GLSL ES中数组索引的限制。