【问题标题】:Is this the best way to access array elements using non-constant index in GLSL 1.0?这是在 GLSL 1.0 中使用非常量索引访问数组元素的最佳方式吗?
【发布时间】:2018-08-16 21:44:27
【问题描述】:

我需要根据 1.0 规范编写,这样我也可以在 WebGL 1.0 上运行。 我想出了以下辅助函数。

Q1:这是可以做到的最好的吗?有没有更多创意的方式? (注意:在编译源代码时,我有制服的总长度,我可以将其注入源代码。但是,在编写逻辑时,我不知道我在处理什么,所以我不能使用vec4 或类似的东西)

Q2:如果我不使用统一数组,而是使用纹理,那么创建大小为 1-10 的纹理的效率如何?然后使用 texture2D() 调用访问元素?

precision mediump float;
varying vec4 vColor;
uniform float alpha[5];
float getItem(float[5] a, int index) {
    for(int i=0; i<5;i++) {
        if(i==index) return a[i];
    }
}
void main(void) {
    float c = getItem(alpha, i+1);
    gl_FragColor = vColor;
}

【问题讨论】:

  • 又一个例子说明了为什么应该使用纹理。 float elem = texture2D(arrayTexture, vec2((.5 + index) / textureWidth, 0)).r;
  • 纹理对于像 1 到 10 这样的非常小的尺寸是否合适?我很乐意创建它们,因为它们总体上简化了我的代码

标签: glsl webgl


【解决方案1】:

根据规范,GLSL ES v1.0 应该支持统一数组的动态索引。为什么不使用array[index] 来采样制服?

关于纹理,如果你的数据量很小,它不如使用制服那么有效,特别是如果你需要在应用程序运行时更改数据。

【讨论】:

  • 不确定这是否真的有效。刚刚在 Firefox 中做了这个简单的测试,有一个错误告诉我“索引表达式必须是常量”:`precision mediump float;均匀浮点 M[4];不同的 vec4 vColor; void main(void) { int i = 1;浮动 k = M[i*2]; gl_FragColor = vColor; }`
  • 是的,因为索引包括乘法。无需使用即可重写代码。
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多