2015.09.15
- 人×技術
openframeworks サウンド篇 tiger2
どうも、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値を代入。
}
座標が反映されましたね!
おもったよりスムーズにできました!
これを応用して今回のアニメーション作成しました。
文章がながくなってきたので、
今回作ったアニメーションの制作過程端折ります。
今回も曲はタンバがつくってくれました!
ありがとうございます。