VRエンジン作成日記

ひたすらVRエンジンを作っていきます

シェーダ関連機能の追加

今日はシェーダに関連する機能を追加していた。昨日書いたように、シェーダ言語では設定しきれないけどレンダリングに必要な項目がいくつかある。UnityではShaderLabのPassブロックの中で、レンダリングステートとして設定できるようになっている。この辺りの機能はライブラリのユーザ側で設定できないと描画用の機能が減って不便なので、エンジン内に実装しておいた方が良い。

docs.unity3d.com

Unityではこの辺の機能はうまく隠蔽されていて、ShaderLab以外の場所、C#スクリプト等からは設定変更ができないようになっているらしい。なぜそうなっているかというと、DirectXOpenGL等の描画用APIバージョンアップごとに、その時代の一般的なハードウェア事情に合わせて調整されているらしく、どの部分でハードウェアアクセラレーションが有効になるか等が考慮された上でAPIが作られている。そう考えると、いつ基盤が変更されても後方互換性を持たせられるように (今の時代のUnityで作ったスクリプトが変更なしに数年後のUnityでビルドできるように)、変化する可能性があるものはできるだけユーザ側に公開しないようになっているんだろうと思う。シェーダを書き換える手間はかかるかもしれないけど、どこでどのように使われるか分からないC#スクリプト内で自由に操作できてしまうと、後方互換性を維持するコストが増すだろうと考えることができる。

今のところtea.jsでは、そこまで考慮するのは難しいため、全部公開するような感じで書いている。うまくAPIを隠蔽するためには、プログラミング言語の記述テクニック的な難しさもあるし、将来的に変更される可能性のある箇所についての予想を立てるために、描画APIについての深い知識も必要になる。予想した内容が的外れだった場合、ライブラリの使い心地の悪さが際立ってしまうことになる。

・関連するコミット

add shader settings · hikipuro/tea.js@0faf8af · GitHub

 

追記

検索してみると、C#スクリプトからレンダリングステートの変更はできるようだった。調べる前に書いていることもあるので、疑問に感じる箇所があった人は検索した方が正確に理解できると思う。

qiita.com