フォト

Google AdSense

  • AdSense
無料ブログはココログ

« オライリーから出るUnityの日本語の書籍 | トップページ | 9月に入って »

2011.08.31

Unity Technologies BlogからマルチプラットフォームでのHLSL/Cg/GLSLシェーダのコンパイルについての話題

ちょっと最近、HLSLとCg、GLSLの3つのシェーダ言語を使ってマルチプラットフォームで開発することについて色々と考えていたり調べたりしていたのですが、Unityの技術blogにUnityのマルチプラットフォームでのシェーダの扱いに関しての興味深い記事がありました。

Shader Compilation for Multiple Platforms
http://blogs.unity3d.com/2010/10/20/shader-compilation-for-multiple-platforms/

Unityではモバイルプラットフォーム(iOSデバイスやAndroid)をサポートするまではCg/HLSL でシェーダを記述するのが基本みたいで、オプションの設定をすればGLSLが書けるということだったみたいです。

ただ、これだとマルチプラットフォームで動かす場合、特にOpenGL ES 2.0では動かせないので、かつてATIが公開していたオープンソースツールのHLSL2GLSLをフォークさせて新たなツールを作って自動トランスコードをして問題を解決したみたいですね(名前が微妙なのは認めてるようだ)。

ちなみに、hlsl2glslforkを使う際の注意点ですが、HLSLやCgのコードに#includeやプリプロセッサが使われているとうまくトランスコードすることができないのでそういうのは1つのファイルに展開する必要があります。このあたりはトランスコードの前準備のためのツールとか欲しいですね。

hlsl2glslforkプロジェクト
http://code.google.com/p/hlsl2glslfork/

これで、自動でシェーダの変換が出来てバンザイ…とは行かず、このhlsl2glslforkでモバイル向けにGLSLを出力した場合、最適化がうまくいっていないようで激遅なようですね。そこでMesa3Dで開発しているGLSLコンパイラを調査したところなかなかいい感じだったみたいですね。そしてそこからglsl-optimizerというのを作ったみたいですね。これでパフォーマンスの問題はかなり改善したようですね。

glsl-optimizer
https://github.com/aras-p/glsl-optimizer

このblog記事は2010年の10月のものですが、この段階では次のステップとしてOpenGL ES 2.0のシェーダにある精度まわり(lowp/mediump/highp)のトランスコードもうまくやりたいようですね。Cgなんかだとhalf型なんかがあってhalf型を使うとサイクル数が減少する環境もあるのでそうしたものを考慮するってことなんでしょうね。

昔はシェーダはHLSLやCgでだいたい用事が住んでいたのですが、コレにぜんぜん違う構文のGLSLが加わってくると色々とシェーダの使い回しや記述、管理に頭を悩ませることが増えると思うのですが自動トランスコードと自動最適化でGLSLは人間が書かないという発想はいいかもしれませんね。

« オライリーから出るUnityの日本語の書籍 | トップページ | 9月に入って »

Programming」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« オライリーから出るUnityの日本語の書籍 | トップページ | 9月に入って »