Mugichoko's blog

Mugichoko’s blog

プログラミングを中心としたメモ書き.

Unity + GLSLではSSBOが使えない?

先日からUnity + GLSLで初歩的な実装を試してきましたが,SSBO (Shader Storage Buffer Object) が使えなくて困っています... 具体的にはプレイボタンを押した際にGLSLのコンパイルが始まりますが,SSBOを宣言をしている行でエラーが出てコンパイルに失敗します.

以下のようなコードをVertex Shader含んでいる場合...

layout (std430, binding=0) buffer ssboData
{
    vec4 position;
} 

... 以下のようなエラーがでます.

f:id:Mugichoko:20190214184224p:plain
Unityが吐き出したエラー

Syntax Errorって,そんな馬鹿な... とは言え,そもそもbindingのIDはどうやってC#スクリプトから指定するのか,それすらもよく分からないようなUnity初心者の私です.解決策をしばらくググってみたのですが,特段の議論すら見つからず... しばらく調べて思ったのは,ほとんどの人がSSBOを使うようなアプリケーションを作っていなさそうだということと,UnityならCg/HLSLを使うだろうという暗黙の了解がありそうだ,ということです.

他の方法として,テクスチャをSSBOの代わりに使うといったレガシー的な方法も思いつきますが面倒です.ということで,マルチプラットフォームに対応の観点から利点が多いですし,学びなおすこともそれほど多くないだろうと思い,次回からUnityのシェーダに切り替えることにします.

追記(原因解明)

結局,UnityのCg/HLSLシェーダでも,GLSL用に変換し直した後に同じエラーに見舞われました.ここのUnity Forumsの情報によると,私と同じような状況の人へのUnity Technologyからの回答に以下のようなコメントがあった.

Most likely your device doesn't support StructuredBuffers in vertex shaders. It's not a requirement for OpenGL ES 3.1+ to have it. ― Unity Forums

とのことで,Vertex ShaderでのSSBOの実装は必須でないためハードウェア的に実装されてない可能性があるとのこと.なるほど.つまり,Vertex Shader内で大量のデータにアクセスするには,テクスチャをSSBOの代わりに使うというレガシー的な方法を取るしかなさそうです.