2012-02-29 4 views
5

GLSL에서 다른 함수의 인수로 함수를 사용하는 방법을 찾고 있습니다. 보통 C에서는 함수 포인터를 함수 인수로 전달하여 시뮬레이션 할 수 있습니다. 또한 다른 언어 (예 : HLSL)가 고차원 함수와 같은 상위 수준 구조를 처리하는 방법을 제공하거나이를 clever use of HLSL structures으로 시뮬레이트 할 수있는 것으로 보입니다. 불행히도 지금 GLSL에 붙어있어 고차 함수를 시뮬레이션 할 수있는 방법을 찾을 수 없습니다. 현재 (4.2) GLSL에서 실제로 불가능합니까? 아니면 영리한 트릭을 놓치고 있습니까? 내가 달성하기 위해 노력하고있어의GLSL의 2 차 함수?

일반적인 예 :

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

그리고 쉐이더에서 이런 종류의 (아마도 비용이 많이 드는) 간접 지정이 필요합니다 ...? –

+0

이런 종류의 추상화는 사용하기 쉽다는 사실 외에도 실제 문제는 다음과 같습니다. 매개 변수 p (int라고 가정)를 전환하는 함수 f가 있고 다른 함수 f2 이 성격은 교환 된 가치에 달려있다. f2를 인수로 전달할 수있게되면 전환하지 않고 직접 호출 할 수있게됩니다. 이는 응용 프로그램의 컨텍스트에서 f 자체를 호출 할 때 f 내부에서 호출 할 함수를 정확히 알고 있기 때문입니다. 나는 그것이 가능할 지, 어떤 비용이 들지는 모르지만, 100 개의 스위치를 사용하는 것이 더 나쁘다고 생각합니다. –

+0

https://en.wikipedia.org/wiki/Defunctionalization – sigfpe

답변

4

나는 GLSL에서 다른 함수에 인수로 함수를 사용하는 방법을 찾고 있어요.

짧은 대답 : 할 수 없습니다.

GLSL에서 얻을 수있는 기능 중 가장 가까운 것은 shader subroutines입니다. 그리고 외부의 OpenGL API만이 쉐이더 자체가 아닌 사용할 서브 루틴을 선택할 수 있습니다.

그럼 switch/case 문을 수행하고 끝내십시오.

+0

조언 해 주셔서 감사합니다. 그러나 GLSL이 포인터가없는 C보다 높은 수준의 구조를 제공 할 수없는 이유는 무엇입니까? –

+0

@AlexRepain : GLSL은 * 재귀 *를 지원하지 않는 환경에서 실행되어야합니다. 함수 포인터가 작동하기를 기대하는 이유는 무엇입니까? –

+0

함수 포인터가 작동 할 것으로 기대하지 않습니다. 해결 방법이 있는지 묻습니다. 게다가, 나는 재귀 그 자체를 필요로하지 않는다. 나는 콜백 패스를 찾고있다. 재귀를 형성 한 다음 내 얼굴에 날려 버릴 수 있다는 사실은 받아 들일만한 부작용이 될 것입니다. 게다가 'while'을 처리 할 수 ​​있다면 왜 환경이 재귀를 전혀 처리 할 수 ​​없는지 (꼬리 호출 재귀를 생각해보십시오) ... –