7

我正在寻找一种将函数用作 GLSL 中另一个函数的参数的方法。在常规 C 中,可以通过将函数指针作为函数参数传递来模拟它。似乎其他语言(如 HLSL)现在也提供了处理高级构造(如高阶函数)的方法,或者可以巧妙地使用 HLSL 结构来模拟它们。不幸的是,我现在被 GLSL 困住了,我找不到任何方法来模拟高阶函数。当前(4.2)GLSL真的不可能吗?还是我错过了一些聪明的把戏?

我正在努力实现的常见示例:

int f(someType f2, int i) {
    return f2(i);
}
4

2 回答 2

5

我正在寻找一种将函数用作 GLSL 中另一个函数的参数的方法。

简短的回答:你不能。

与您在 GLSL 中获得的这种功能最接近的是着色器子例程。而且这只允许外部 OpenGL API 选择要使用的子程序,而不是着色器本身。

所以只需做switch/case声明并完成它。

于 2012-02-29T17:36:20.680 回答
0

GLSL 中没有高阶函数,但可以模拟它们:

#define second_order 1
#define second_order1 2
#define another_function 3
//there are no function pointers in GLSL, so I use integers instead

int call(int f2,int param1){
    //instead of a function, an integer is passed as a parameter
    switch(f2){
        case second_order:
            return param1*2;
        case second_order1:
            return param1*3;
    }
}

int call(int f2,int param1,int param2){
    //this function can be overloaded to accept more parameters
    switch(f2){
        case another_function:
            return param1 + param2;
    }
}

int f(int f2, int i) {
    return call(f2,i);
}

或者,这可以使用结构来完成:

struct function{
    int x;
};
function Sin(){
    return function(1);
}
function Cos(){
    return function(2);
}
float call(function func,float x){
    if(func == Sin()){
        return sin(x);
    }
    else if(func == Cos()){
        return cos(x);
    }
}

vec4 map(function func,vec4 a1){
    //this function can be overloaded for different array sizes
    vec4 a2;
    for(int i = 0; i < 4; i++){
        a2[i] = call(func,a1[i]);
    }
    return a2;
}

也可以使用宏来模拟通用二阶函数:

#define map(function,input1,output1) \
for(int i = 0; i < input1.length(); i++){ \
    output1[i] = function(input1[i]); \
}

此宏可用于任何类型的数组:

float[] arr1 = float[](1.,3.,4.);
float[arr1.length()] output1;
map(sin,arr1,output1)
于 2019-11-02T17:05:42.373 回答