現在地 >> メニュー >> 基本編10 >> VertexBufferObject(part2) >> VBO::まとめコード3

問題

答え

#include <iostream>
#include <GL/glew.h>

#include <GL/glut.h>

//---------- 頂点の配列データ ------------------//
//6面、4頂点、1頂点はx,y,zの3要素
float PointAry[6][4][3] =
{
	//1つめの面(v0,v1,v2,v3)
	{ {0,0,0},{1,0,0},{1,1,0},{0,1,0}},
	//2つめの面(v1,v5,v6,v2)
	{ {1,0,0},{1,0,-1},{1,1,-1},{1,1,0} },
	//3つめの面(v4,v7,v6,v5)
	{ {0,0,-1},{0,1,-1},{1,1,-1},{1,0,-1} },
	//4つめの面(v4,v0,v3,v7)
	{ {0,0,-1},{0,0,0},{0,1,0},{0,1,-1} },
	//5つめの面(v3,v2,v6,v7)
	{ {0,1,0},{1,1,0},{1,1,-1},{0,1,-1} },
	//6つめの面(v0,v4,v5,v1)
	{ {0,0,0},{0,0,-1},{1,0,-1},{1,0,0} }
};
//------------ 法線データ --------------//
float NormalAry[6][4][3] =
{
	//1つめの面(v0,v1,v2,v3)
	{{0,0,1},{0,0,1},{0,0,1},{0,0,1}},
	//2つめの面(v1,v5,v6,v2)
	{{1,0,0},{1,0,0},{1,0,0},{1,0,0}},
	//3つめの面(v4,v7,v6,v5)
	{{0,0,-1},{0,0,-1},{0,0,-1},{0,0,-1}},
	//4つめの面(v4,v0,v3,v7)
	{{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}},
	//5つめの面(v3,v2,v6,v7)
	{{0,1,0},{0,1,0},{0,1,0},{0,1,0}},
	//6つめの面(v0,v4,v5,v1)
	{{0,-1,0},{0,-1,0},{0,-1,0},{0,-1,0}}
};



//---------- 色データ ------------//
float ColorAry[6][4][3] =
{
	//1つめの面(v0,v1,v2,v3)
	{{0,0,1},{0,0,1},{0,0,1},{0,0,1}},
	//2つめの面(v1,v5,v6,v2)
	{{1,0,0},{1,0,0},{1,0,0},{1,0,0}},
	//3つめの面(v4,v7,v6,v5)
	{{0,1,1},{0,1,1},{0,1,1},{0,1,1}},
	//4つめの面(v4,v0,v3,v7)
	{{1,1,0},{1,1,0},{1,1,0},{1,1,0}},
	//5つめの面(v3,v2,v6,v7)
	{{0,1,0},{0,1,0},{0,1,0},{0,1,0}},
	//6つめの面(v0,v4,v5,v1)
	{{1,0,1},{1,0,1},{1,0,1},{1,0,1}}
};

//---------- 頂点の配列データ2 ------------------//
//4面、3頂点、3座標
float PointAry2[4][3][3] =
{
	{{0,0,0},{0,0,1},{0,1,0}},
	{{0,0,0},{1,0,0},{0,0,1}},
	{{0,0,0},{0,1,0},{1,0,0}},
	{{0,1,0},{0,0,1},{1,0,0}}
};

float NormalAry2[4][3][3] =
{
	{{-1,0,0},{-1,0,0},{-1,0,0}},
	{{0,-1,0},{0,-1,0},{0,-1,0}},
	{{0,0,-1},{0,0,-1},{0,0,-1}},
	{{1,1,1},{1,1,1},{1,1,1}}
};

float ColorAry2[4][3][3] =
{
	{{1,0,0},{1,0,0},{1,0,0}},
	{{0,1,0},{0,1,0},{0,1,0}},
	{{0,0,1},{0,0,1},{0,0,1}},
	{{0,1,1},{0,1,1},{0,1,1}}
};

//VBO用ID
GLuint VboId[2];



//------------ プロトタイプ宣言 --------------//
void display();
void reshape(int w, int h);
void DRAW();
void timer(int value);
void BuildVBO();


//------------- OpenGLの初期設定 ------------------//
void GLUT_INIT()
{
	glutInitDisplayMode(GLUT_RGBA| GLUT_DOUBLE | GLUT_DEPTH);
	glutInitWindowSize(640,480);
	glutCreateWindow("VBOs");
}

void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutTimerFunc(0,timer,17);
}

void MY_INIT()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glEnable(GL_DEPTH_TEST);

	//材質はglColorで設定する
	glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
	glEnable(GL_COLOR_MATERIAL);

	glEnable(GL_LIGHT0);
	glEnable(GL_LIGHTING);
}


//-------------- メイン関数 ----------------//
int main(int argc, char **argv)
{
	glutInit(&argc,argv);
	GLUT_INIT();
	GLUT_CALL_FUNC();
	MY_INIT();
	glewInit();

	BuildVBO();

	glutMainLoop();

	return 0;
}


//--------------- ここからコールバック ------------------//
void display()
{
	static int r = 0;
	static float LightPos[]= {10,10,10,0};

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glLoadIdentity();
	gluLookAt(3.0, 4.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); //視点の設定

	glLightfv(GL_LIGHT0, GL_POSITION, LightPos);

	glPushMatrix();
	glRotatef(static_cast<float>(r),1,0,0);
	glRotatef(static_cast<float>(r+45),0,1,0);
	DRAW();//描画
	glPopMatrix();

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

void timer(int t)
{
	glutPostRedisplay();
	glutTimerFunc(t,timer,17); //タイマー関数
}



//------------ ここから各種関数 ------------------//
void DRAW()
{
	glBindBuffer(GL_ARRAY_BUFFER, VboId[0]);  //バインド
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);


	glColorPointer(3,GL_FLOAT, 0, (void*)(sizeof(PointAry)+sizeof(NormalAry)));//色を設定(3色、float型、オフセット0)
	glNormalPointer(GL_FLOAT, 0, (void*)sizeof(PointAry));//法線を設定
	glVertexPointer(3, GL_FLOAT, 0, 0); //1頂点は3つで構成、float型、オフセット0、データ元
	glDrawArrays(GL_QUADS,0,4*6);


	glBindBuffer(GL_ARRAY_BUFFER, VboId[1]);  //バインド
	glColorPointer(3,GL_FLOAT, 0, (void*)(sizeof(PointAry2)+sizeof(NormalAry2)));//色を設定(3色、float型、オフセット0)
	glNormalPointer(GL_FLOAT, 0, (void*)sizeof(PointAry2));//法線を設定
	glVertexPointer(3, GL_FLOAT, 0, 0); //1頂点は3つで構成、float型、オフセット0、データ元
	glDrawArrays(GL_TRIANGLES,0,3*4);

	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);
	glBindBuffer(GL_ARRAY_BUFFER, 0);
}


//--------------------------//
void BuildVBO()
{
	glGenBuffers(2, &VboId[0]);   //発生

	//VBO1つ目
	glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド

	//データをVBOにコピー
	//xyzの3座標*4頂点*6面 *
	int bufferSizes = (3*4)*6*sizeof(float) + (3*4)*6*sizeof(float) + (3*4)*6*sizeof(float);
	glBufferData(GL_ARRAY_BUFFER, bufferSizes, 0, GL_STATIC_DRAW);//メモリ確保


	//データコピー
	glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(PointAry), PointAry);
	glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry), sizeof(NormalAry), NormalAry);
	glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry)+sizeof(NormalAry), sizeof(ColorAry), ColorAry);

	//例外チェック(VBOと配列のサイズがあっているか?)
	int bufferforCheck = 0;

	glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck);
	if(bufferSizes != bufferforCheck)//一致していない場合
	{
		std::cerr << "Can't Create VBO\n";
		glDeleteBuffers(2, &VboId[0]);
		exit(0);
	}


	//VBO 2つ目
	glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド
	int bufferSizes2 = (3*3)*4*sizeof(float) + (3*3)*4*sizeof(float) + (3*3)*4*sizeof(float);

	glBufferData(GL_ARRAY_BUFFER, bufferSizes2, 0, GL_STATIC_DRAW);//メモリ確保
	//データコピー
	glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(PointAry2), PointAry2);
	glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry2), sizeof(NormalAry2), NormalAry2);
	glBufferSubData(GL_ARRAY_BUFFER, sizeof(PointAry2)+sizeof(NormalAry2), sizeof(ColorAry2), ColorAry2);

	//例外チェック(VBOと配列のサイズがあっているか?)
	bufferforCheck = 0;

	glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck);
	if(bufferSizes2 != bufferforCheck)//一致していない場合
	{
		std::cerr << "Can't Create VBO\n";
		glDeleteBuffers(2, &VboId[0]);
		exit(0);
	}

	glBindBuffer(GL_ARRAY_BUFFER, 0); //バインド
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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