오픈 셰이딩 언어에 오신 것을 환영합니다!
OSL(Open Shading Language)은 고급 렌더러 및 기타 애플리케이션에서 프로그래밍 가능한 셰이딩을 위한 작지만 풍부한 언어로, 재료, 조명, 변위 및 패턴 생성을 설명하는 데 이상적입니다.
OSL은 원래 장편 영화 애니메이션 및 시각 효과에 사용되는 사내 렌더러에서 사용하기 위해 Sony Pictures Imageworks에서 개발되었으며, 다른 시각 효과 및 애니메이션 스튜디오와 렌더링 소프트웨어 공급업체에서 사용할 수 있도록 오픈 소스로 출시되었습니다. 이제 VFX 및 애니메이션 기능을 위한 사실상의 표준 셰이딩 언어가 되었으며 업계 전반에 걸쳐 많은 상업용 및 스튜디오 독점 렌더러에서 사용됩니다. 이로 인해 OSL 작업은 2017년 아카데미 기술 공로상을 수상했습니다.
OSL은 강력하고 프로덕션에서 입증되었으며 "어메이징 스파이더맨", "호텔 트란실바니아", "엣지 오브 투모로우", "앤트맨", "도리를 찾아서" 등 다양한 영화에 사용되었습니다. OSL 지원은 고급 VFX 및 애니메이션 작업에 사용되는 대부분의 주요 렌더러에 있습니다. 영화 및 제품의 전체 목록을 보려면 영화를 참조하세요.
OSL 코드는 "New/3-clause BSD" 라이선스에 따라 배포되며 문서는 Creative Commons Attribution 4.0 International License에 따라 배포됩니다. 간단히 말해서, 귀하는 무료인지 상업용인지, 개방형인지 독점인지에 관계없이 자신의 응용 프로그램에서 OSL을 자유롭게 사용할 수 있을 뿐만 아니라 OSL 코드 및 문서를 원하는 대로 수정할 수 있습니다. 단, 다음에 설명된 대로 원본 저작권 고지를 유지해야 합니다. 라이센스.
OSL에는 C 및 기타 음영 언어와 유사한 구문이 있습니다. 그러나 이는 고급 렌더링 알고리즘을 위해 특별히 설계되었으며 래디언스 클로저, BSDF 및 지연 광선 추적과 같은 기능을 일류 개념으로 갖추고 있습니다.
OSL에는 다른 음영 언어에서는 볼 수 없는 몇 가지 고유한 특성이 있습니다(물론 전부는 아닙니다). OSL이 다른 언어와 다른 점은 다음과 같습니다.
표면 및 볼륨 셰이더는 최종 색상이 아닌 광휘 폐쇄를 계산합니다.
OSL의 표면 및 볼륨 셰이더는 표면이나 볼륨이 빛을 산란시키는 방식에 대한 "폐쇄"라는 명시적인 기호 설명을 광도 단위로 계산합니다. 이러한 발광 폐쇄는 특정 방향으로 평가되거나, 중요한 방향을 찾기 위해 샘플링되거나, 나중에 평가 및 재평가를 위해 저장될 수 있습니다. 이 새로운 접근 방식은 광선 추적 및 전역 조명을 지원하는 물리 기반 렌더러에 이상적입니다.
대조적으로, 다른 음영 언어는 일반적으로 특정 방향에서 보이는 표면 색상만 계산합니다. 이러한 오래된 셰이더는 렌더러가 이 하나의 정보를 찾기 위해 거의 수행할 수 없지만 실행할 수 있는 "블랙 박스"입니다(예를 들어 샘플링에 중요한 방향을 발견할 수 있는 효과적인 방법이 없습니다). 게다가 조명과 표면의 물리적 단위가 제대로 지정되지 않는 경우가 많아 셰이더가 물리적으로 올바른 방식으로 작동하는지 확인하기가 매우 어렵습니다.
표면 및 볼륨 셰이더는 조명 위에 반복되거나 광선을 발사하지 않습니다.
OSL 표면 셰이더에는 "광 루프"나 명시적으로 추적된 조명 광선이 없습니다. 대신, 표면 셰이더는 표면이 빛을 산란시키는 방법을 설명하는 발광 클로저를 계산하고 "적분기"라고 하는 렌더러의 일부는 특정 광원 세트에 대한 클로저를 평가하고 광선을 추적해야 하는 방향을 결정합니다. 반사 및 굴절과 같이 일반적으로 명시적인 광선 추적이 필요한 효과는 단순히 발광 폐쇄의 일부이며 다른 BSDF처럼 보입니다.
이 접근 방식의 장점은 광선 일관성을 높이기 위해 통합 및 샘플링을 일괄 처리하거나 재정렬할 수 있다는 것입니다. BSDF를 최적으로 샘플링하기 위해 "광선 예산"을 할당할 수 있습니다. 클로저는 양방향 광선 추적 또는 메트로폴리스 광 전송에 사용될 수 있습니다. 클로저는 셰이더를 다시 실행하지 않고도 새로운 조명으로 신속하게 재평가될 수 있습니다.
표면 셰이더와 라이트 셰이더는 동일합니다.
OSL에는 광원에 대한 별도의 셰이더 종류가 없습니다. 조명은 단순히 방출되는 표면이며 모든 조명은 영역 조명입니다.
투명성은 또 다른 종류의 조명일 뿐입니다.
셰이더에서 투명도/불투명도 변수를 명시적으로 설정할 필요는 없습니다. 투명도는 빛이 표면과 상호 작용하는 또 다른 방법일 뿐이며 표면 셰이더가 계산하는 주요 래디언스 클로저에 포함됩니다.
렌더러 출력(AOV)은 "광 경로 표현"을 사용하여 지정할 수 있습니다.
때로는 반사, 확산, 반사, 개별 조명 등과 같은 개별 조명 구성 요소를 포함하는 이미지를 출력하는 것이 바람직합니다. 다른 언어에서는 일반적으로 이러한 개별 수량을 수집하는 셰이더에 과다한 "출력 변수"를 추가하여 수행됩니다.
이를 달성하기 위해 OSL 셰이더는 코드나 출력 변수로 복잡해질 필요가 없습니다. 대신, 어떤 빛 경로가 어떤 출력에 기여해야 하는지 설명하기 위한 정규식 기반 표기법이 있습니다. 이 작업은 모두 렌더러 측에서 수행됩니다(OSL 구현에서는 지원되지만). 새로운 출력을 원하는 경우 셰이더를 전혀 수정할 필요가 없습니다. 렌더러에게 새로운 빛의 경로 표현을 알려 주기만 하면 됩니다.
셰이더는 네트워크로 구성됩니다.
OSL 셰이더는 모놀리식은 아니지만 일부 노드의 명명된 출력이 네트워크 내 다른 노드의 명명된 입력에 연결되는 셰이더 네트워크(때때로 셰이더 그룹, 그래프 또는 DAG라고도 함)로 구성될 수 있습니다. 이러한 연결은 렌더링 시 동적으로 수행될 수 있으며 개별 셰이더 노드의 컴파일에는 영향을 주지 않습니다. 또한 개별 노드는 해당 노드에 의존하는 나중 노드에서 해당 출력을 "풀"하는 경우에만 지연 평가됩니다(셰이더 작성자는 이러한 세부 사항을 인식하지 못하고 모든 것이 정상적으로 평가되는 것처럼 셰이더를 작성할 수 있습니다).
그리드나 추가 음영점이 없는 임의의 파생물입니다.
OSL에서는 셰이더에서 계산된 양의 파생물을 취하고 임의의 양을 텍스처 좌표로 사용하여 올바른 필터링을 기대할 수 있습니다. 이 경우 음영 처리된 점을 직사각형 그리드에 배열하거나 특정 연결성을 갖거나 "추가 점"을 음영 처리할 필요가 없습니다. 이는 도함수는 인접 점과의 유한 차이로 계산되는 것이 아니라 셰이더 작성자의 개입 없이 도함수로 이어지는 변수에 대한 편미분을 계산하는 "자동 미분"을 통해 계산되기 때문입니다.
OSL은 렌더링 시 적극적으로 최적화합니다.
OSL은 LLVM 컴파일러 프레임워크를 사용하여 셰이더 네트워크를 즉석에서(Just In Time 또는 "JIT") 기계 코드로 변환하고, 그 과정에서 셰이더 매개변수 및 기타 런타임 값에 대한 완전한 지식을 바탕으로 셰이더와 네트워크를 크게 최적화합니다. 셰이더가 소스 코드에서 컴파일될 때 알려졌습니다. 결과적으로 우리는 OSL 셰이딩 네트워크가 C로 직접 제작한 동급 셰이더보다 25% 더 빠르게 실행되는 것을 확인했습니다! (이것이 렌더러에서 이전 셰이더가 작동하는 방식입니다.)
OSL 오픈 소스 배포판은 다음 구성 요소로 구성됩니다.
oslc는 OSL 소스 코드를 어셈블리와 유사한 중간 코드(.oso 파일 형식)로 변환하는 독립 실행형 컴파일러입니다.
liboslc는 셰이더 컴파일러의 기능을 포함하는 OSLCompiler 클래스를 구현하는 라이브러리입니다. 누군가가 이를 다른 애플리케이션에 포함해야 하고 컴파일러가 별도의 실행 파일이 되는 것을 원하지 않는 경우를 대비합니다.
liboslquery는 OSLQuery 클래스를 구현하는 라이브러리입니다. 이를 통해 애플리케이션은 해당 매개변수, 해당 유형 및 연관된 메타데이터의 전체 목록을 포함하여 컴파일된 셰이더에 대한 정보를 쿼리할 수 있습니다.
oslinfo는 liboslquery를 사용하여 셰이더 및 해당 매개변수에 대한 모든 관련 정보를 콘솔에 인쇄하는 명령줄 프로그램입니다.
liboslexec는 ShadingSystem 클래스를 구현하는 라이브러리로, 컴파일된 셰이더를 애플리케이션 내에서 실행할 수 있습니다. 현재 LLVM을 사용하여 셰이더 바이트코드를 x86 명령어로 JIT 컴파일합니다.
testshade는 점의 직사각형 배열에서 셰이더(또는 연결된 셰이더 네트워크)를 실행하고 해당 출력을 이미지로 저장할 수 있는 프로그램입니다. 이를 통해 완전한 기능을 갖춘 렌더러에 통합할 필요 없이 셰이더(및 셰이딩 시스템)를 확인할 수 있으며 대부분의 테스트 스위트 확인의 기초가 됩니다. testrender와 함께 testshade는 OSL 라이브러리를 호출하는 방법을 보여주는 좋은 예입니다.
testrender는 셰이딩에 OSL을 사용하는 작은 광선 추적 렌더러입니다. 기능은 매우 최소한이며(현재는 구형만 허용됨) 성능에는 관심이 없습니다. 하지만 OSL 라이브러리가 작동하는 렌더러에 통합되는 방법, 렌더러가 제공해야 하는 인터페이스, BSDF/ 발광 폐쇄를 평가하고 통합해야 합니다(다중 중요도 샘플링 포함).
몇 가지 샘플 셰이더.
문서 - 현재는 OSL 언어 사양(셰이더 작성자에게 유용함)으로 구성되어 있지만 앞으로는 OSL 라이브러리를 렌더러에 통합하는 방법에 대한 자세한 문서가 제공될 것입니다.
이 목록에는 OSL 사용이 명시되었거나 공개 소스에서 추론할 수 있거나 여기에 나열해도 좋다고 알려진 영화 또는 제품만 포함되어 있습니다. OSL 사용 프로젝트가 누락되었고 비밀이 아닌 경우 OSL 프로젝트 리더에게 이메일을 보내거나 이 파일을 편집하여 PR을 제출하세요.
(OSL 지원을 추가하는 대략적인 순서)
(여기서 "중요한 작업"은 극장이나 주요 스트리밍 플랫폼에서 개봉된 장편 영화, 시각 효과나 애니메이션이 많이 포함된 TV/스트리밍 시리즈 또는 주요 상을 수상했거나 후보에 오른 단편 영화를 의미하는 것으로 간주됩니다.)
OSL을 빌드하고 설치하는 방법에 대한 자세한 지침은 INSTALL.md 파일을 읽어보세요.
OSL 언어 사양은 src/doc/osl-언어spec.pdf(소스 배포판) 또는 설치된 바이너리 배포판의 share/doc/OSL/osl-언어spec.pdf 파일에서 찾을 수 있습니다.
ReadTheDocs의 실험적 OSL 문서 이것은 향후 문서가 될 것입니다. 아마도 PDF만큼 완전할 수 있지만 약간의 교정이 필요하므로 현재로서는 PDF가 여전히 권위 있는 소스로 간주됩니다. 그러나 조만간 이 온라인 문서를 위해 이전 PDF 사양이 더 이상 사용되지 않을 것입니다.
PDF 버전도 있습니다.
OSL에서 셰이더를 프로그래밍하는 방법을 배우는 데 관심이 있는 분들을 위해 Siggraph 2022 Educator's Forum OSL Shaders for RenderMan 과정이 있습니다. 이 과정은 예제와 보충 자료에서 RenderMan을 사용하지만 주로 OSL의 셰이더 작성에 관한 것입니다.
간단한 "어떻게...", "문제가 생겼어요" 또는 "이게 버그인가요"에 대한 질문은 osl-dev 개발자 메일 목록에서 가장 잘 물어볼 수 있습니다. 대부분의 사람들이 이를 보고 잠재적으로 귀하의 질문에 신속하게 답변할 수 있는 곳입니다(GH "문제"보다 더 그렇습니다).
비교적 확실한 코드 문제이고 재현 방법에 대한 명확한 지침을 제공할 수 있는 버그, 빌드 문제 및 발견된 취약점은 문제로 보고되어야 합니다.
OSL에서 잠재적인 취약점을 발견했다고 생각되면 security@openshading언어.org로 프로젝트 관리자에게 이메일을 보내 비밀리에 신고해 주세요.
다른 문제에 대해 공개 질문이나 문제를 배제하는 기밀 유지가 필요한 경우 [email protected]으로 프로젝트 관리자에게 개인적으로 문의할 수 있습니다.
OSL은 코드 기여를 환영하며 지난 몇 년 동안 거의 50명이 기여했습니다. 우리는 일반적인 GitHub PR(풀 요청) 메커니즘을 통해 코드 기여를 받습니다. 자세한 지침은 CONTRIBUTING을 참조하세요.
OSL GitHub 페이지
OSL 개발 메일 목록을 읽거나 구독하세요.
OSL 언어 사양의 최신 PDF
OSL 홈페이지
현재 프로젝트 리더십은 거버넌스 파일에 문서화되어 있습니다.
Steve Agland, Shane Ambler, Martijn Berger, Farchad Bidgolirad, Nicholas Bishop, Curtis Black, Rasmus Bonnedal, Solomon Boulos, Stefan Bruens, Stefan Büttner, Matthaus G 등 많은 사람들이 수년에 걸쳐 OSL에 기능, 버그 수정 및 기타 변경 사항을 제공했습니다. Chajdas, Clark Chen, Mehdi Chinoune, Alejandro Conty, Damien Courtois, Dieter De Baets, Thomas Dinges, Daniel Dresser, Mads Drøschler, Peter Ellerington, Luke Emrose, Louis Feng, Mark Final, Henri Fousse, Stephen Friedman, Syoyo Fujita, Tim 그랜트, 래리 그리츠, 니콜라스 기아드, 유안 하르, 데릭 하세, 스벤-헨드릭 하세, 존 해든, 니클라스 해리슨, 다니엘 헤켄버그, 크리스 헬무스, 아드리앙 헤루벨, 댄 호락, 티아고 이제, 맷 존슨, 로난 케리엘, 크리스 쿨라, 엘빅 리앙, 맥스 리아니, 아담 마르티네즈, 존 머틱, 바스티앙 몽타뉴, 스티나 몬테이로, 패트릭 무어스, 알렉시스 오블레, 에리히 오션, 오타마 미코, 박지노, 알렉세이 파울로우, 미치 프라터, 제이 레이놀즈, 데클란 러셀, 베누아 루이즈, 패트릭 샤이베, Alex Schworer, Jonathan Scruggs, Sergey Sharybin, Mark Sisson, Sandip Shukla, Cliff Stein, Stephan Steinbach, Luya Tshimbalanga, Esteban Tovagliari, Brecht Van Lommel, Thibault Vergne, Alexander von Knorring, Aidan Welch, Alex Wells, Roman Zulak. (알파벳순으로 나열되어 있습니다. 누락된 사람이 있으면 실수로 알려 주시기 바랍니다.)
이 프로젝트를 진행하도록 허용하고 진심으로 지원하며 소스 공개를 허용한 Sony Pictures Imageworks의 관리자, 특히 Rob Bredow, Brian Keeney, Barbara Ford, Rene Limberger, Erik Strauss 및 Mike에게 깊은 감사를 표할 수 없습니다. 포드.
SPI의 크랙 셰이딩 팀과 쇼에 OSL을 기꺼이 사용하려는 용감한 룩디바이스 TD와 CG에도 큰 감사를 드립니다. 그들은 우리의 실험용 피그, 영감, 테스터 및 환상적인 피드백 소스 역할을 했습니다. 물론 OSL을 제품과 파이프라인에 통합한 다른 곳의 많은 엔지니어, TD 및 아티스트, 특히 Chaos Group, Double Negative, Pixar, DNA, Isotropix 및 Animal Logic의 초기 위험 감수자들도 마찬가지입니다. 감사합니다. 귀하의 요구에 응답해 드렸기를 바랍니다.
OSL은 단독으로 개발되지 않았습니다. 우리는 언어 사양의 초기 초안을 인내심 있게 읽고 매우 유용한 피드백과 추가 아이디어를 제공한 개인과 스튜디오뿐만 아니라 다른 VFX 및 애니메이션 스튜디오의 현재 개발자와 사용자의 지속적인 기여와 피드백에도 빚을 지고 있습니다.
OSL 구현은 호환 가능한 라이센스가 있는 여러 다른 오픈 소스 패키지에 따라 달라집니다.
OSL 문서에는 BSD 라이센스에 따라 배포되는 Markdeep (c) 2015-2016, Morgan McGuire 및 하이라이트.js (c) 2006, Ivan Sagalaev의 일부가 포함되어 있습니다.