先日からUnity + GLSLで初歩的な実装を試してきましたが,SSBO (Shader Storage Buffer Object) が使えなくて困っています... 具体的にはプレイボタンを押した際にGLSLのコンパイルが始まりますが,SSBOを宣言をしている行でエラーが出てコンパイルに失敗します.
以下のようなコードをVertex Shader含んでいる場合...
layout (std430, binding=0) buffer ssboData
{
vec4 position;
}
... 以下のようなエラーがでます.
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の代わりに使うというレガシー的な方法を取るしかなさそうです.