現在地メニュー >> NVIDIA_SDK >> NVIDIA_SDK_07 >> NVIDIA_SDK_07::まとめ

問題


NVIDIA SDK付属の
  • 「framebufferObject.h」、「framebufferObject.cpp」、
  • 「renderbuffer.h」、「renderbuffer.cpp」
を使ってFBO::まとめコードと同じ動作をさせよ。

答え

#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);
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます