2017-11-14 10 views
1

Shader Schoolで行列のn乗を返す関数を実装する演習を行っています。私は、n次関数に定数パラメータを渡す場合でも:これが可能であるどのようにGLSL関数で渡されたパラメータが定数として認識されない

Loop index cannot be compared with non-constant expression 

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

私は次のエラーを取得しますか?

答えて

1

キーワードconstは、nが書き込み可能でないことを示しますが、変数でも定数ではありません。
nは、仮パラメータへの呼び出しが渡された実際のパラメータによって異なります。 OpenGL ES 2.0にリストされている可能制限AR The OpenGL ES Shading Language 1.0のAppandix Aにおける

for loops are supported but with the following restrictions:

  • condition has the form loop_index relational_operator constant_expression
    where relational_operator is one of: > >= < <= == or !=


章においてThe OpenGL ES Shading Language 1.0の5.10定数式が明確CONST関数のパラメータは定数式ではないことを、言われています。

A constant expression is one of
- a literal value (e.g., 5 or true)
- a global or local variable qualified as const excluding function parameters
- an expression formed by an operator on operands that are constant expressions, including getting an element of a constant vector or a constant matrix, or a field of a constant structure
- a constructor whose arguments are all constant expressions
- a built-in function call whose arguments are all constant expressions, with the exception of the texture lookup functions.


問題を回避するには、定数式Aによって制限されるループを作成することであろうndをbreakからループ外に出す条件:

for (int i = 1; i < 10; ++i) 
{ 
    if (i >= n) 
     break; 
    result = result * m; 
} 
関連する問題