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
系が導入された時期
- glRenderbufferStorage: OpenGL 3.0
- glTexStorage1d: OpenGL 4.2
- glTexStorage2D: OpenGL 4.2
- glTexStorage3D: OpenGL 4.2
- glBufferStorage: OpenGL 4.4
ということで,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