GLSL函数中传递的参数未被识别为常量



我正在着色器学校做一个练习,在这个练习中我实现了一个返回矩阵n次方的函数。即使我将常数参数n传递到以下函数中:

mat2 matrixPower(highp mat2 m, const int n) {
if(n==0) {
return mat2(1.0);
} else {
mat2 result = m;
for(int i=1; i < n; ++i) {
result = result * m;
}
return result;
}
}

我得到以下错误:

Loop index cannot be compared with non-constant expression

这怎么可能?

关键字const表示n不可写,但它仍然是一个变量而不是常量
n随函数调用时实际参数与形式参数的不同而变化。

OpenGL ES着色语言1.0附录A中的注释列出了OpenGL ES 2.0的可能限制:

for循环是受支持的,但有以下限制:

  • 条件具有以下形式loop_index relational_operator constant_expression
    其中relational_operator是以下之一:>>=<<===!=

在OpenGL ES Shading Language 1.0的第5.10章中明确指出,常量函数参数不是常量表达式:

常量表达式是的一个

  • 文字值(例如,5或true)
  • 限定为常量的全局或局部变量,不包括函数参数
  • 由运算符对作为常量表达式的操作数形成的表达式,包括常向量或常矩阵的元素,或常结构的场
  • 参数都是常量表达式的构造函数
  • 一个内置函数调用,其参数都是常量表达式,纹理查找函数除外

解决方法是创建一个受常量表达式限制的循环,并在循环外使用条件break

for (int i = 1; i < 10; ++i)
{
if ( i >= n )
break;
result = result * m;
}

最新更新