Shader Calls

Houdini 12.5를 시작으로, VEX shader 함수들은 다른 shader 함수들을 호출할 수 있게 되었다. 이 기술은 VEX 컴파일러를 최적화를 할 수 있게 했고 큰 shader에 대한 퍼포먼스를 더 최적화 했다. shader 또는 다른 shader들에 여러번 호출된 코드가 한번 생성될 수 있고 추가적인 런타임 없이 여러번 사용되기 때문이다.

The import keyword

import 키워드는 현재 shader에 이름으로 다른 shader 함수를 소개한다. 임포드된 shader는 연산이 성공되도록 Houdini 경로로 접근이 가능해야만 한다. 만약 찾을 수 없다면 shader 계산은 실패할 것이다. 그래서 다른 shader를 호출해 shader를 제작할 때, 종속 순서로 shader를 만들 필요가 있다. 먼저 호출된 shader를 만들고, 그리고 호출한 shader를 만든다. 순환 호출(circular call)은 가능하지만 호출한 것을 만든 후 import 키워드를 호출된 것에 추가해야만 한다.

예를 들어, plastic shader를 임포트 할 때 :

import plastic;

shader들은 그들 스스로 반복해서 호출할 수 있다 – 이 경우, import 키워드는 요구되지 않는다.

Invoing a shader

shader들은 이름으로 호출되고 키워드 인자들로 전달된다 – 호출된 shader에서 전달되거나 전달 받을 인자들을 확인할 string/value 페어이다. 몇가지 파라미터들에만 바인드하는게 가능하다. 어떤 경우 호출된 shader는 바인드 되지 않은 파라미터들에 대해 디폴트 값드를 사용할 것이다. 추가적으로, 호출된 shader에서부터 추출된 것들의 서브셋들만이 바인드 될 필요가 있다. 이 경우, VEX optimizer가퍼포먼스 향상을 위해 필요하지 않는 추출된 것들을 계산하는 죽은 코드를 보여줄 것이다.

예를 들어, 이 코드는 Cf export에 대해 문의하고 diff 인풋을 제공하는 platic shader를 호출한다 :

1
2
3
4
5
6
import plastic;
surface caller(vector diff = {1,0.5,0})
{
    plastic(“diff”, diff, “Cf”, Cf);
}
cs

vcc는 인자(argument) 또는  호출된 shader의 파라미터 리스트에 존재하는 것과 상응하는 호출된 shader로 전달될 모든 사용가능한 인자들을 확인할 것이다. – 만약 타입 또는 접근 모드가 일치하지 않으면, 오류가 발생할 것이다.

Context of the called shader

Shader들은 현재 context 타입이 일치하는 shader들만을 호출 할 수 있다. 전역 변수를 가진 context들에 대해,  키워드 인자들로써의 shader에 명확하게 제공되지 않는 모든 전역 변수들은 호출하는 shader에서 호출된 shader로 변경되지 않고 복사된다. 추가적인 불투명한 상태 정보를 다루는 context들에 대해서, 이 정보는 호출된 shader에서 유지되어, getraylevel()과 같은 호출 메소드들은 호출하는 것과 호출받는 것에거 같은 결과를 제공할 것이다.

Examples

호출된 shader :

1
2
3
4
5
6
7
8
cvex callee(export int mval = 0;
        int rval = 0;
        export int wval = 0;
        float castval = 0)
{
    mval *= 2;
    wval = rval;
}
cs

호출하는 shader :

1
2
3
4
5
6
7
8
9
10
11
import callee;
cvex caller()
{
int mval = 1;
int rval = 2;
int wval = 1;
    callee(“mval”, mval, “rval”, rval, “wval”, wval, “castval”,
1);
printf(“%d %d %d\n”, mval, rval, wval);
}
cs

반복(recursive) shader :

1
2
3
4
5
6
7
8
9
10
11
import callee;
cvex caller()
{
    int mval = 1;
    int rval = 2;
    int wval = 1;
    callee(“mval”, mval, “rval”, rval, “wval”, wval, “castval”,
            1);
    printf(“%d %d %d\n”, mval, rval, wval);
}
cs

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s