 |
| Mango의 작용 방법: 셰이더 호출
— John Schlag
Mango는 두 가지 방법으로 이전에 결코 보여준 적이 없는 셰이더를 다룰 수 있습니다. Mango로 사용자 정의된 셰이더를 사용하는 것이 가능할 뿐만 아니라, Maya 셰이더의 구현을 추가할 수도 있습니다.
Mango로 사용자 정의 셰이더를 사용하려면, 사용자 매뉴얼에서 셰이더 오버라이드 를 참고하십시오. 간략하게, Maya의 내장 셰이더와 함께 혹은 대신에 GSL에서 쓰여진 젤라토 셰이더를 사용할 방법을 제공합니다.
둘째 방법인 Maya 셰이더의 구현을 추가하려는 두 가지 이유가 있습니다. 첫째, Mango는 Maya 대응부와 일치하는 셰이더의 콜렉션을 옮기지만 일부가 빠져 있습니다. 이러한 틈새 중 하나를 채우려고 하실 수도 있습니다. (채울 경우, 저희에게 알려 주십시오. 채워진 새 셰이더를 저희가 후속 릴리스의 일부로 포함할 수도 있습니다.) 둘째, 물론 Mango가 이전에 결코 보여준 적이 없는 Maya 셰이더 플러그인을 귀하가 혹은 다른 누군가가 작성할 수도 있습니다. 젤라토에서 이 새 셰이더 렌더링을 얻기 위해, GSL과 가능하게 DSO shadeop의 일부 결합을 필요로 할 것입니다.
이 모든 작용 방법을 이해하려면, 한 단계 뒤로 가서 Mango가 셰이더를 처리하는 방법을 살펴보겠습니다.
Mango에 대한 설계 적요의 일부는 사용자가 GSL에서 작성하려 할 수 있는 어떤 사용자 작성 셰이더와 내장 Maya 셰이더 둘 다를 처리해야 한다는 것입니다. 그러한 요구 사항때문에, Mango는 다음을 할 수 있어야 합니다:
- 모든 shader .gso 파일 (당사 혹은 사용자 파일) 엽니다
- 셰이더의 매개 변수 목록을 취합니다
- Maya 노드에 부합하는 속성을 찾아냅니다
- 연결되지 않은 속성값(동영상 혹은 비동영상)을 기록합니다
- 그리고 최종적으로, “상향”텍스처로의 연결을 통해 추적하고 추적한 것들에 대해서도 동일하게 수행합니다
물론, Mango는 사용자 정의 셰이더 매개 변수의 U.I. 항목을 속성 편집자에 추가할 수도 있습니다. 이렇게 하면 사용자 정의 셰이더를 내장 셰이더와 가능한 한 많이 똑같게 만들 수 있습니다. 사용자는 매개 변수를 편집하고, 동영상화하고 Maya에서 사용했던 방법으로 짜넣을 수 있습니다.
Mango는 사용자 정의 셰이더용으로 이 모든 것을 해야 하기 때문에, 내장 셰이더를 다루기 위해 마찬가지로 같은 코드를 사용하는 것이 합리적입니다. 그러므로, 중요한 점은: Mango 플러그인이 Maya의 내장 셰이더에 대해서 거의 아는 것이 없다는 것입니다. 이상하게 들릴지 모르겠지만 사실입니다. Mango의 Maya 에뮬레이션 셰이더는 GSL로 작성되므로 작성하신 모든 사용자 정의 셰이더와 같은 체제입니다. 또 다른 방법으로 표현하자면, 작성하신 셰이더는 일급 시티즌입니다.
일단 새 셰이더를 작성했고 gslc, 에 정확하게 따른다면, 컴파일된 .gso 파일이 셰이더 검색 경로 어딘가에 있다는 것을 ("string path:shader" 속성을 확인하십시오, 젤라토 렌더 글로벌에서 설정하십시오) 확인하십시오. 그런 후에 Mango는 해당 파일을 찾아 상기에 기술한 대로 처리합니다.
Maya 에뮤레이션 셰이더를 작성하려면 또는 사용자 정의 Maya 셰이더 플러그인과 일치하려면, 해당 속성 이름이 Maya 셰이더 노드상에 속성 이름과 일치한다는 것을 확인해야 합니다.
이외에도 다소의 트릭이 있습니다. 젤라토는 Maya 속성의 모든 유형을 처리할 수 없으므로 Mango가 약간 도와서 완성시킵니다.
- GSL에서 예약 단어인 매개 변수/속성 이름에 밑줄(_)이 앞에 놓여 있을 수 있습니다. 예를 들어, 가장 인기있는 셰이더 매개 변수 이름 중 하나는 물론 ‘color’입니다. 그러므로 GSL 매개 변수는 "_color" 입니다.
- 메시지 속성은 연결된 노드의 이름과 함께 문자열로 쓰여집니다. (이것은 shadingSwitch 노드가 작용하는 방법 중 일부입니다.)
- 젤라토 2.1 시점에서, GSL은 변수 길이 배열을 지원합니다. 하지만, 이전 버전에서와 복합 속서의 일부 복잡한 경우에, Mango는 셰이더 매개 변수의 배열 요소로의 맵핑을 지원합니다. 밑줄(_)은 점(.)이 되고 "_n"은 "[n]"이 됩니다. 예를 들어, input_3_alpha 는 input[3].alpha가 됩니다.
- GSL에서 struct 가 없고 일부 Maya의 속성이 struct의 배열이 됩니다. 예를 들어, tripleShadingSwitch의 input 속성은 GSL에서 "struct { color inTriple; string inShape; } input[]"으로 쓰여집니다. 대신, 셰이더 매개 변수는 단순히 "color inTriple[]"과 "string inShape[]"입니다. 일단 Mango가 배열 매개 변수에 대해 일치하는 Maya 속성을 찾는다면, 찾은 속성이 배열이 아닌 경우, Mango는 부모 속성이 배열인지를 알기 위해 한 레벨 위를 확인합니다.
- 일부 셰이더는 두 개로 구현됩니다. 비록 버전 2.1 시점으로의 젤라토가 수요 주도형 순서로 셰이더를 실행한다 하더라도, 상향 셰이더로 인수를 통과시키기 위한 명백한 메커니즘이 아직 없습니다. 그러므로, 예를 들어, maya_projection을 호출하는 셰이더를 작성할 때, Mango는 maya_projection_pre.gso를 먼저 찾고, 상향 커넥션을 횡단하기 전에 커넥션을 호출하는 셰이더를 작성하고 최종적으로 maya_projection.gso를 호출하는 셰이더를 작성합니다. "예비" 셰이더는 전형적으로 음영 그래프에서 다른 셰이더에 의해 사용된 텍스처 좌표를 계산합니다. Mango는 사용자의 셰이더를 위해 “예비” 셰이더를 기꺼이 작성할 것입니다.
이 모든 것은 사용자가 Mango의 Maya 에뮬레이션 셰이더 혹은 사용자 정의 셰이더 혹은 둘 다를 사용하기 위한 완전한 유연성이 있다는 것을 의미합니다. 음영 그래프에서 이 셰이더들을 혼합하실 수도 있습니다. 사실, gelatoShader 문자열 속성이 있을 경우, 어떤 노드도 오버라이드될 수 있습니다, 하지만 표면 셰이더(lambert, blinn, phong 등)만이 해당 노드에 대한 사용자 인터페이스가 있습니다. |