问题描述
vec2 s[5];
s[1] = vec2(0.0,0.1);
s[2] = vec2(0.5,0.8);
int dist = 0;
dist++;
float tst = s[dist].x;
在我的例子中使用数组的目的是计算索引并获取该索引的内容。如果我必须使用常量,我将如何计算索引? (顺便说一句,在我的情况下,使用纹理作为输入效率不高)。
解决方法
见OpenGL ES Shading Language 1.00 Specification - Appendix A - Indexing of Arrays,Vectors and Matrices:
以下是常量索引表达式:
- 常量表达式
- 第 4 节中定义的循环索引
- 由以上两者组成的表达式
因此,数组的索引也可以是for循环的控制变量:
for (int i = 0; i < 2; i++)
{
float tst = s[i].x;
// [...]
}
应该指出的是,此限制适用于 OpenGL ES Shading Language 1.00 (WebGL 1.0),但不适用于 OpenGL ES Shading Language 3.00 (WebGL 2.0)。
见OpenGL ES Shading Language 3.00 Specification - 12.30 Dynamic Indexing:
对于 GLSL ES 1.00,没有强制要求支持数组、向量和矩阵的动态索引,因为某些实现不直接支持它。软件解决方案(通过程序转换)适用于部分案例,但会导致性能不佳。 GLSL ES 3.00 是否应该强制支持动态索引?
解决方案:强制支持对除采样器数组、片段输出数组和统一块数组之外的数组进行动态索引。