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

时间:2017-11-14 01:55:33

标签: glsl

我在Shader School做了一个练习,我在其中实现了一个返回矩阵n次幂的函数。即使我将常量参数n传递给以下函数:

import random

inputs =  ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','1','2','3','4','5','6','7','8','9','0']
func = {}
code = ""
z = len(inputs)
x = z-1
temp = inputs[:]    #<-- here
while x >= 0:
    y = random.choice(temp)
    print(str(x) + "   " + inputs[x] + "   " + y)
    func[inputs[x]] = y
    code = code+inputs[x] + y
    del temp[x]
    x = x - 1
    print(temp)
    print(inputs)

我收到以下错误:

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 个答案:

答案 0 :(得分:1)

关键字const表示n不可写,但它仍然是变量而不是常数!
n随着对形参的调用传递的实际参数而变化。

注意在The OpenGL ES Shading Language 1.0的Appandix A中列出了OpenGL ES 2.0的可能限制:

  支持

for循环但具有以下限制:

     
      
  • 条件有表格   loop_index relational_operator constant_expression
      其中relational_operator是以下之一:> >= < <= ==!=
  •   


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

  

常量表达式是其中之一    - 字面值(例如,5或真)
   - 限定为const的全局或局部变量,不包括函数参数
   - 由操作符在常量表达式操作数上形成的表达式,包括获取   常数向量或常数矩阵的元素,或常数结构的字段
   - 一个构造函数,其参数都是常量表达式
   - 内置函数调用,其参数都是常量表达式,但纹理查找函数除外。


一种解决方法是创建一个受常量表达式限制的循环,并通过条件将break输出循环:

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