Shader storage block は Uniform に比べてはるかに大きな記憶容量を提供するためのもので,それを利用してシェーダ間でデータを共有することができるそうです.また,競合を避けるための排他制御の仕掛けもあるようです.

「ようです」と書いたのは,ちょっと試したところ Yosemite では利用できなさそうなんです.シクシク.

sb05gx.cpp (sb05g.vs)


以下が実行ログです.

 1 projects/glsb6 » sb05g
 2 VENDOR:   ATI Technologies Inc.
 3 VERSION:  4.1 ATI-1.30.5
 4 RENDERER: AMD Radeon R9 M295X OpenGL Engine
 5 
 6 /Users/wakita/Dropbox (smartnova)/work/opengl/glsb6/media/shaders/sb05g.vs
 7 info: ERROR: 0:8: 'buffer' : syntax error: syntax error
 8 
 9 
10 Shader: /Users/wakita/Dropbox (smartnova)/work/opengl/glsb6/media/shaders/sb05g.vs
11 #version 410 core
12 
13 struct vertex {
14   vec4 position;
15   vec3 color;
16 };
17 
18 layout buffer my_vertices {
19   vertex vertices[];
20 };
21 
22 uniform mat4 Transform;
23 
24 out VS_OUT {
25   vec3 color;
26 } vs_out;
27 
28 void main(void) {
29   vertex v = vertices[gl_VertexID];
30   gl_Position = Transform * v.position;
31   vs_out.color = v.color;
32 }

VSの8行目(見にくくてすみません.上のログの18行目です.)に問題があるようです.ここの記述は元々は layout (binding = 0, std340) buffer my_vertices となっていました.std430 は OpenGL 4.3 ではいった形式なので,エラーになるのは当然,ということでこれは削除しました.binding = 0 も駄目なのかと思って,レイアウト指示をすべて削除したのにまだエラーになります.Shader storage block の指定である buffer がそもそも駄目なようです.

Shader storage buffer objectの仕様書によれば,この規格が採用されたのがOpenGL 4.3以後なのだから無理というわけですね.シクシク.

ちょっと気になるのが ARB_shader_storage_buffer_objectというCore ARB拡張です.ひょっとして,これが利用できるなんてことはあるんだろうか?


OpenGLにgl*Storage系が導入された時期

ということで,GPU に大量のデータを置いて OpenGL 描画させるのは Mac では難しいということ?もし,そうだとすると開発基盤を Linux に移さないと...


で,glewinfoで調べたところ,GL_ARB_*_storageの道も断たれているらしいことがわかりました.全然,ダメじゃないの.

$ » glewinfo | grep 'ARB.*storage' |grep -v 'OK *$'
GL_ARB_buffer_storage:                                         MISSING
GL_ARB_compressed_texture_pixel_storage:                       MISSING
GL_ARB_shader_storage_buffer_object:                           MISSING
GL_ARB_texture_storage:                                        MISSING
GL_ARB_texture_storage_multisample:                            MISSING