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

問題

VBO::まとめコード2を変更して、それぞれの配列に対してVBOを用意して描画せよ

答え

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

#include <GL/glut.h>

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

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

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


//VBO用ID
GLuint VboId[3];//3つ分


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


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

void GLUT_CALL_FUNC()
{
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutIdleFunc(idle);
}

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();
	glDeleteBuffers(3, &VboId[0]);//使い終わったら削除(終了処理部分で書く)

	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 idle()
{
	glutPostRedisplay();
}


//------------ ここから各種関数 ------------------//
void DRAW()
{
	//格納場所を伝える
	glBindBuffer(GL_ARRAY_BUFFER, VboId[0]);  //バインド
	glVertexPointer(3, GL_FLOAT, 0, 0);

	glBindBuffer(GL_ARRAY_BUFFER, VboId[1]);  //バインド
	glNormalPointer(GL_FLOAT, 0, 0);

	glBindBuffer(GL_ARRAY_BUFFER, VboId[2]);  //バインド
	glColorPointer(3,GL_FLOAT, 0, 0);

	//有効化して描画
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);

	glDrawArrays(GL_QUADS,0,4*6);

	glDisableClientState(GL_COLOR_ARRAY);
	glDisableClientState(GL_NORMAL_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);


}


//--------------------------//
void BuildVBO()
{
	int bufferforCheck = 0; //チェック用

	glGenBuffers(3, &VboId[0]);   //発生

	//頂点
	glBindBuffer(GL_ARRAY_BUFFER, VboId[0]); //バインド
	glBufferData(GL_ARRAY_BUFFER, sizeof(PointAry), PointAry, GL_STATIC_DRAW);
	glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck);
	if(sizeof(PointAry) != bufferforCheck)//一致していない場合
	{
		std::cerr << "Can't Create VBO\n";
		glDeleteBuffers(3, &VboId[0]);
		exit(0);
	}

	//法線
	glBindBuffer(GL_ARRAY_BUFFER, VboId[1]); //バインド
	glBufferData(GL_ARRAY_BUFFER, sizeof(NormalAry), NormalAry, GL_STATIC_DRAW);
	glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck);
	if(sizeof(NormalAry) != bufferforCheck)//一致していない場合
	{
		std::cerr << "Can't Create VBO\n";
		glDeleteBuffers(3, &VboId[0]);
		exit(0);
	}

	//色
	glBindBuffer(GL_ARRAY_BUFFER, VboId[2]); //バインド
	glBufferData(GL_ARRAY_BUFFER, sizeof(ColorAry), ColorAry, GL_STATIC_DRAW);
	glGetBufferParameteriv(GL_ARRAY_BUFFER, GL_BUFFER_SIZE, &bufferforCheck);
	if(sizeof(ColorAry) != bufferforCheck)//一致していない場合
	{
		std::cerr << "Can't Create VBO\n";
		glDeleteBuffers(3, &VboId[0]);
		exit(0);
	}        
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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