openframeworksでshader

ofのofshaderで、グリッチかっこいいなと思って調べながらshaderプログラミングをやってみた。

メモ
・shaderを使う事でGPU側で頂点と面の描写を行う事で処理を高速化できる。
・シェーダーは実行時にコンパイルして使う。
・バーテックスシェーダは頂点毎に1個1個実行される
・フラグメントシェーダはピクセル単位で実行される


/* ofShader */
ofShader shader;
shader.load("vertex_shader.vert", "fragment_shader.frag");


//draw関数で
shader.begin();
//beginとendの中だとシェーダーが適応される
ofBox(0, 0, 0, 100);
shader.end();

シェーダーに値を渡す事もできてshaderインスタンスの
setUniform~、setAttribute~系のメソッドで渡す。

uniform→全頂点、全ピクセル共通の値。
attributes→頂点毎に違う値を渡せる。頂点シェーダ専用。

頂点毎にランダムな値を渡す方法がよくわかんなくて、
ofじゃないけどこんな感じでやったらできた気がする。

GLint uAberrationOffset = shader.getAttributeLocation( "uAberrationOffset" );
glEnableVertexAttribArray( uAberrationOffset );
glVertexAttrib1f( uAberrationOffset,ofRandom() );

参考
簡単なソース付きofshader解説 ≫ http://blog.jahfer.com/2012/04/02/experimenting-shaders-openframeworks/
glsl基礎(WebGLの記事だけどglsl部分は一緒) ≫ http://www.atmarkit.co.jp/ait/articles/1211/26/news012.html

openglパイプライン解説 そうまとめpdf
http://cedec.cesa.or.jp/2009/ssn_archive/pdf/sep1st/PG74_1.pdf

webgl glsl解説まとめ
≫ http://www.atmarkit.co.jp/ait/articles/1211/26/news012_2.html

attributes解説系
≫ http://monsho.blog63.fc2.com/blog-date-200903.html
≫ http://www.arakin.dyndns.org/glsl_qualifier.php
glVertexAttribPointer

プリミティブ図形描写まとめ
≫ http://d.hatena.ne.jp/aidiary/20080824/1281749722