最終更新:
mikk_ni3_92 2009年12月05日(土) 16:42:13履歴
現在地:メニュー >> NVIDIA_SDK >> NVIDIA_SDK_07 >> NVIDIA_SDK_07::まとめ
NVIDIA SDK付属の
NVIDIA SDK付属の
- 「framebufferObject.h」、「framebufferObject.cpp」、
- 「renderbuffer.h」、「renderbuffer.cpp」
#include <iostream> #include <gl/glew.h> #include <gl/glut.h> #include "framebufferObject.h" #include "renderbuffer.h" #ifdef _DEBUG #pragma comment(lib,"glew32d.lib") #else #pragma comment(lib,"glew32.lib") #endif //------------ 各種外部変数 ------------// std::pair<int,int> TextureWH(512,512); unsigned int texID[1]; FramebufferObject *fbo; Renderbuffer *rbo; //---------- 各種プロトタイプ -----------// void display(); void reshape(int w, int h); void timer(int value); void createTexture(); //--------- GLUTの初期化 ---------------// void GLUT_CALL_FUNCs() { glutDisplayFunc(display); glutReshapeFunc(reshape); glutTimerFunc(0,timer,17); } void myOtherInit() { glEnable(GL_DEPTH_TEST); } void GLUT_INITs(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(TextureWH.first,TextureWH.second); glutCreateWindow("FBO and RBO using NVIDIA SDK"); GLUT_CALL_FUNCs(); myOtherInit(); } //--------- GLEWの初期設定 ------------// bool GLEW_INIT() { GLenum err; err = glewInit(); if (err != GLEW_OK){ std::cerr << glewGetErrorString(err) << "\n"; return false; } return true; } //NVIDIA SDKによるFBOとRBO作成 void createFBOandRBObySDK() { fbo = new FramebufferObject(); rbo = new Renderbuffer(GL_DEPTH_COMPONENT, TextureWH.first,TextureWH.second); //テクスチャ->FBO のアタッチメント fbo->AttachTexture(GL_TEXTURE_2D, texID[0], GL_COLOR_ATTACHMENT0_EXT); ////RBO->FBOのアタッチメント fbo->AttachRenderBuffer(rbo->GetId(), GL_DEPTH_ATTACHMENT_EXT); fbo->IsValid();//エラーチェック FramebufferObject::Disable(); } //--------- メイン関数 ---------// int main(int argc, char **argv) { GLUT_INITs(argc,argv); if ( GLEW_INIT() == false){return -1;} createTexture();//テクスチャ作成 createFBOandRBObySDK(); glutMainLoop(); //破棄 glDeleteTextures(1, &texID[0]); delete fbo; delete rbo; return 0; } void display() { static int r = 0; fbo->Bind();//fbo切り替え glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(static_cast<float>(r),0,1,0); glColor3f(0,1,0); glutWireTeapot(0.5); glColor3f(1,0,0); glutWireCube(0.2); glColor3f(1,1,1); glPopMatrix(); //出力先を通常のフレームバッファの戻す FramebufferObject::Disable(); //これ以降は通常の描画 glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texID[0]); glGenerateMipmapEXT(GL_TEXTURE_2D);//ミップマップの生成 glBindTexture(GL_TEXTURE_2D, 0); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindTexture(GL_TEXTURE_2D, texID[0]); glPushMatrix(); glRotatef(static_cast<float>(r),0,1,0); glBegin(GL_QUADS); glColor3f(1,1,1); glTexCoord2f(1, 1); glVertex3f(1,1,0); glTexCoord2f(0, 1); glVertex3f(-1,1,0); glTexCoord2f(0, 0); glVertex3f(-1,-1,0); glTexCoord2f(1, 0); glVertex3f(1,-1,0); glEnd(); glPopMatrix(); glBindTexture(GL_TEXTURE_2D, 0); glutSwapBuffers(); if(++r > 360){ r = 0;} } void reshape(int w, int h) { glViewport(0, 0, w, h); //ビューポートの設定 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0, (double)w / (double)h, 1.0, 100.0); //視野の設定 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 2.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //視点の設定 } void timer(int value) { glutPostRedisplay(); glutTimerFunc(value,timer,17); //タイマー関数 } //---------- テクスチャオブジェクト作成 ---------// void createTexture() { glGenTextures(1,&texID[0]); glBindTexture(GL_TEXTURE_2D, texID[0]); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); //自動的なミップマップの作成 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, TextureWH.first,TextureWH.second, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); }