どうも、TIGER-TANIOKAです。

openFrameWorksでサウンドビジュアライズに挑戦その2。

今回は、vertexshaderに挑戦!
アニメーションつくってみました。
 

shader、vboを定義、shaderを読み込む

shader、vboを定義します。

##ofApp.h ============================================================
class ofApp : public ofBaseApp{
public:
...
...
...
  ofShader shr;
  ofVbo vbo;


##ofApp.cpp ============================================================
void ofApp::setup(){
  shr.load("shr.verts" , "shr.frag");
}

vboとは

vboとは
色情報:: setColorData()
法線情報:: setNormalData()
頂点情報:: setVertexData()
等、いろいろな情報を格納でき、
それらをまとめてshaderに渡せます。

それではやってみます。

##ofApp.h ============================================================
class ofApp : public ofBaseApp{
public:
...
...
...
  ofVec3f vertsData[PARITCLE_MAX];
  ofVec3f normalsData[PARITCLE_MAX];
  ofFloatColor colorsData[PARITCLE_MAX];


##ofApp.cpp ============================================================
void ofApp::setup(){

  for(int i = 0; i < PARTICLE_MAX; i++){
    vertsData[i] = ofVec3f(x座標, y座標, z座標);
    normalsData[i] = ofVec3f(x座標, y座標, z座標);
    colorData[i] = ofFloatColor(, , , 透明); #今回これつかってません。
  }

  #第1引数がデータ ,第2引数がトータルの数 ,第3引数は用途によって変更、今回はデータが頻繁にかわるのでこれー。
  vbo.setVertexData(vertsData , PARTICLE_MAX ,GL_DYNAMIC_DRAW);
  vbo.setNormalData(normalsData , PARTICLE_MAX ,GL_DYNAMIC_DRAW);
  vbo.setColorData(colorsData , PARTICLE_MAX ,GL_DYNAMIC_DRAW);
}



void ofApp::update(){
#cpp側で座標いじくってupdate
  for(int i = 0; i < PARTICLE_MAX; i++){
    vertsData[i] = ofVec3f(x,y,z);
    normalsData[i] = ofVec3f(x,y,z);
    colorData[i] = ofFloatColor(r,g,b,a);
  }
  vbo.updateVertexData(vertsData , PARTICLE_MAX);
  vbo.updateNormalData(normalsData , PARTICLE_MAX);
  vbo.updateColorData(colorsData , PARTICLE_MAX);
}


void ofApp::draw(){
  shr.begin();
  vbo.draw(GL_POINTS , 0 , PARTICLE_MAX);
  shr.end();
}

##shr.verts ============================================================
void main(){
  #gl_Normal::さっきvboに格納したnormalsData
  #gl_Vertex::さっきvboに格納したvertsData
  #gl_Color::さっきvboに格納したcolorsData


  vec4 pos = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
  pos.x += 100.0;

  gl_Position = pos;#ここに座標を代入
}


##shr.frag ============================================================
void main(){
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);#color値を代入。
}

座標が反映されましたね!
おもったよりスムーズにできました!

これを応用して今回のアニメーション作成しました。

文章がながくなってきたので、
今回作ったアニメーションの制作過程端折ります。

今回も曲はタンバがつくってくれました!
ありがとうございます。