Font size: +

VEX 언어 참고서

File Name: VEX--
File Size: 40 kb
Download File

공부 겸 http://www.sidefx.com/docs/houdini/vex/lang.html 문서의 일부를 번역한 겁니다.

홈페이지가 문서 첨부나 업데이트가 될 때가 있고 안 될 때가 있어서... 다 해놓고 업데이트가 늦었습니다.

급한대로 깃에다 올려두긴 했는데... 누가 보셨을지는 모르겠네요.


모르는 단어가 있다면 덧글로 질문하세요. 답변과 동시에 해당 내용은 본문에서도 수정됩니다.


아 그리고... VEX의 문법은 C와 상당부분 유사한 것으로 판단됩니다.

제 생각엔 포인터 빠진 C라고 생각하면 될 정도인데...

여러분, C를 배우세요. 


워드 문서를 복붙했더니 사이트에서는 제대로 표시되지 않습니다.  다운 받으세요.


VEX 언어 참고서

VEX의 구문, 자료형과 그 외

이 페이지에는

문법

Statements

Built-in functions

User-defined functions

Main (context) function

Operators

Data types

Structs

Mantra Specific Types

Type casting

Comments

Reserved Keywords

문법

VEX는 특정한 문법으로 쓰이는 프로그램입니다. 그 예시로, 한 물체의 표면 색을 조정하는 셰이더는 surface 문법으로 쓰여집니다. 광원으로부터의 조도를 결정짓는 셰이더는 light 문법으로 쓰여집니다.데이터를 새로 만들거나, 필터링 하는 경우에는 chop 문법을 사용합니다.

문법은 함수, 명령문, 전역 변수에 영향을 줍니다.

VEX를 어떤 방식으로 사용하는지 전체적으로 알아보려면 VEX contexts 를 확인하세요.

만약 표면, displacement, 빛 등, 셰이더를 제작하고 있다면 shading context specific information 역시 참고해야 합니다.

명령문

VEX는 C와 비슷한 명령문을 지원합니다.

또한 illuminancegather 루프 등 셰이더 특화 명령문도 지원합니다. 이것들은 특정 구문에서만 사용 가능합니다.

내장 함수

VEX 는 많은 수의 내장 함수(built-in functions)를 포함하고 있습니다. 몇몇 함수는 특정 구문에서만 사용 가능합니다.

VEX functions.을 참고하세요.

사용자 정의 함수

함수는 C와 비슷한 방식으로 정의됩니다. 반환형, 함수 이름, 괄호로 묶은 매개변수들을 명시하고 뒤이어 코드 블록이 옵니다.

같은 자료형의 매개변수는 반점으로 구분되며, 자료형의 정의를 반복하지 않아도 됩니다. 다른 자료형의 매개변수는 반드시 세미콜론으로 구분되어야 합니다.

int test(int a, b; string c) {

if (a > b) {

printf(c);

}

}

이름이 같고, 매개변수가 다른 함수를 중복 적재(오버로딩)할 수 있습니다. 반환형은 같아도 되고, 달라도 됩니다.

자료형의 모호함을 없애기 위해 선택적으로 function 키워드를 사용해 함수를 정의할 수 있습니다.

function int test(int a, b; string c) {

if (a > b) {

printf(c);

}

}

void print(basis b) {

printf("basis: { i: %s, j: %s, k: %s }\n", b.i, b.j, b.k);

}

void print(matrix m) {

printf("matrix: %s\n", m);

}

void print(bases b) {

printf("bases <%s> {\n", b.description);

printf(""); print(b.m);

printf(""); print(b.n);

printf(""); print(b.o);

printf("}\n");

}

basis rotate(basis b; vector axis; float amount) {

matrix m = 1;

rotate(m, amount, axis);

basis result = b;

result.i *= m;

result.j *= m;

result.k *= m;

return result;

}

void rotate(basis b; vector axis; float amount) {

b = rotate(b, axis, amount);

}

참고사항

사용자 정의 함수는 사용하기 전에 정의되어야 합니다.

함수는 컴파일러가 자동으로 인라인 코드로 바꿉니다. 그러므로 재귀함수는 작동하지 않으며, 재귀함수를 작성하기 위해선 반드시 shader calls 을 사용해야 합니다.

렌더맨 셰이딩 언어와 마찬가지로, 사용자 함수에 전달되는 매개변수는 항상 참조로 전달됩니다. 그렇기 때문에 함수 안에서 이루어진 변수 값의 변경은 함수가 호출된 곳에서도 유효합니다. 매개변수를 강제로 값 전달로 하기 위해선 매개변수를 const로 정의할 수 있습니다. 출력 전용 매개변수를 정의하기 위해 export 예약어를 사용하세요.

사용자 정의 함수의 개수는 무제한입니다.

1개 이상의 return 구문이 허용됩니다.

전역변수에 바로 접근이 가능합니다.(렌더맨 셰이딩 언어와 다르게, extern 선언을 할 필요가 없습니다. 하지만 전역변수에 접근하는 것은 권장하지 않습니다. 그렇게 하면 함수의 행동 범위는 전역변수가 존재하는 하나의 지역 내로 한정할 수 있기 때문입니다. 대신에 전역변수를 함수에 매개변수로 전달하세요.

함수 안에 함수를 정의할 수도 있습니다.(내부 함수)

Main (context) 함수

VEX프로그램은 반환 유형이 context의 이름인 함수를 반드시 하나 포함해야 합니다. 이것이 프로그램의 Main 함수가 되며, Mantra가 이것을 호출하게 됩니다. 한 개의 파일에 한 개의 Main 함수를 포함해야 컴파일이 가능합니다.

Main 함수는 내장, 혹은 사용자 정의 함수를 호출하여 필요한 정보를 계산하거나 전역변수를 수정하는 일을 하게 됩니다. Main 함수에서는 return 구문을 사용하면 안 됩니다. 각각의 구문에서 사용 가능한 전역 변수는 context 문서를 확인하세요.

Main 함수의 매개변수는 프로그램의 UI가 됩니다. 그 예시 중 하나는 VEX 프로그램을 참조하는 셰이딩 노드의 매개변수입니다.

Main 함수의 매개 변수와 이름이 같은 지오메트리 속성이 존재한다면, 그 매개변수가 지오메트리의 속성을 재정의(오버라이드)합니다. 이를 통해 속성을 지오메트리에 덮어 쓰는 방식으로 VEX 코드를 제어할 수 있습니다.

surface

noise_surf(vector clr = {1,1,1}; float frequency = 1;

export vector nml = {0,0,0})

{

Cf = clr * (float(noise(frequency * P)) + 0.5) * diffuse(normalize(N));

nml = normalize(N)*0.5 + 0.5;

}

Note

Main함수의 매개변수는 VEX의 특별한 방식을 사용해 다뤄집니다. 변수와 동일한 이름을 가진 지오메트리의 속성을 사용하여 매개 변수의 값을 덮어 쓸 수 있습니다

이 경우를 제외하고, 매개변수는 셰이더의 범위 안에서는 상수로 취급해야 합니다. 매개변수의 값을 바꾸는 것은 허용되지 않는다는 소리입니다. 이런 경우가 발생한다면 컴파일 시간 에러가 발생하게 됩니다.

매개변수에 export 예약어를 사용해 원본 지오메트리의 수정할 매개변수를 지정할 수 있습니다..

UI pragma

The user interface generated from this program by Houdini will be minimal, basically just the variable name and a generic text field based on the datatype. For example, you might want to specify that frequency should be a slider with a certain range, and that clr should be treated as a color (giving it a color picker UI). You can do this with user interface compiler pragmas.

#pragma opnamenoise_surf

#pragma oplabel"Noisy Surface"

#pragma labelclr"Color"

#pragma labelfrequency"Frequency"

#pragma hintclrcolor

#pragma rangefrequency0.1 10

surface noise_surf(vector clr = {1,1,1}; float frequency = 1;

export vector nml = {0,0,0})

{

Cf = clr * (float(noise(frequency * P)) + 0.5) * diffuse(normalize(N));

nml = normalize(N)*0.5 + 0.5;

}

연산자

VEX는 C의 연산자와, 연산자 우선 순위를 따릅니다. 하지만 다음과 같은 차이점이 있습니다.

곱셈은 두 벡터 또는 점 간 계산에서 정의됩니다. 곱셈은 요소별 곱셈을 수행하며, 내적과 외적은 사용하지 않습니다. cross, dot을 참조하세요.

많은 연산자가 비 스칼라 자료형을 대상으로 정의되어 있습니다. 즉, 벡터에 행렬을 곱하게 되면 벡터를 행렬로 변환하게 됩니다.

두 가지 다른 자료형끼리 연산자를 사용하는 모호한 경우에, 두 번째 값의 자료형을 따릅니다. 예를 들면

int + vector = vector

점(.) 연산자

점 연산자를 사용해 벡터, 행렬, 구조체의 구성 요소에 접근할 수 있습니다.

벡터의 경우, 구성 요소의 이름은 정해져 있습니다.

첫 번째 값

두 번째 값

세 번째 값

네 번째 값

Vector2

.x .u

.y .v

n/a

n/a

vector

.x .r

.y .g

.z .b

n/a

Vector4

.x .r

.y .g

.z .b

.w .a

.x혹은 .u : vector2의 첫 번째 값.

.x or .r to reference the first element of vector and vector4.

.y or .v to reference the second element of vector2.

.y or .g to reference the second element of vector and vector4.

.z or .b to reference the third element. of vector and vector4

.w or .a to reference the fourth element of a vector4.

Uv/xyz/rgba 문자 사용은 정해져 있지 않습니다. 벡터가 점이나 색상을 표현하지 않는 경우에도 적용됩니다.

번역한 사람의 잡소리: 프로그래밍에서 대부분의 경우, 벡터는 숫자의 쌍을 한번에 전달하는 묶음을 나타내기 위해 사용합니다. 일반적으로 벡터라 하면 3개의 숫자 쌍을 의미하며, 뒤에 숫자가 붙는 경우엔 요소의 개수가 뒤에 붙은 숫자와 같습니다. 1개의 숫자는 스칼라 값을 의미하며, 5개 이상의 경우는 극히 드뭅니다. 그래픽스 프로그래밍에서 vector2는 uv, vector는 xyz, vector4는 rgba로 사용하는 암묵적인 룰이 있는 것 같습니다. 이렇게 사용하면 변수 선언부를 보지 않고도 해당 벡터의 요소 개수가 몇 개인지 알 수 있기 때문입니다.

행렬에서, 알파벳 글자를 조합해 사용할 수 있습니다.

.xx = [0][0] 요소

.zz = [2][2] 요소

.ax = [3][0] 요소

번역한 사람의 잡소리: 외우려고 생각하시면 골치 아픕니다. Xyz = 012, Rgba = 0123이라고 생각하시면 되고, 머지 않아 자연스럽게 받아들이시게 되리라 생각합니다.

점 연산자는 벡터값 스위즐링에도 사용됩니다.

v.zyx =(v.z, v.y, v.x): 원래 벡터 값의 순서를 바꿔서 새로운 벡터를 만드는 경우

v4.bgab =(v4.b, v4.g, v4.a, v4.b): 요소의 순서도 바꾸었고, b 요소를 두 번 사용해 새로운 벡터 값을 만드는 경우

비교 연산자

(==, !=, <, <=, >, >=) 와 같은 비교 연산자들은 연산자 양 옆 변수의 자료형이 같을 때 연산이 성립됩니다. 문자열, 부동 소수점, 정수형에만 사용 가능합니다. 결과는 정수형으로 나타납니다.

논리 연산자(&&, ||, and !), 비트 연산자(& |, ^, and ~)는 정수형에만 정의되어 있습니다.

연산자 결합 우선순위

Operators higher in the table have higher precedence.

순서

연산자

결합 순서

설명

15

()

LtR

함수 호출, expression grouping, structure member.

13

!

LtR

논리 부정

13

~

LtR

1의 보수

13

+

LtR

단항 양수

13

-

LtR

단항 음수

13

++

LtR

증가 연산자

13

--

LtR

감소 연산자

13

(type)

LtR

형변환 연산자

12

*

LtR

곱하기

12

/

LtR

나누기

12

%

LtR

나머지

11

+

LtR

2항 연산 더하기

11

-

LtR

2항 연산 빼기

10

<

LtR

미만

10

>

LtR

초과

10

<=

LtR

이하

10

>=

LtR

이상

9

==

LtR

같음 연산

9

!=

LtR

같지 않음 연산

8

&

LtR

비트 연산자 And

7

^

LtR

비트 연산자XOR

6

|

LtR

비트 연산자OR

5

&&

LtR

논리 연산자AND

4

||

LtR

논리 연산자OR

3

?:

LtR

조건 대입 연산자

2

=

+=

-

=

*=

/=

%=

&=

|=

^=

RtL

대입 연산자

산술 대입 연산자

1

,

LtR

매개변수 구분

Fit 이것만 알면 완벽히 쓴다.
객체 지향에 대한 잡설.
Comment for this post has been locked by admin.
 

Comments