OpenGL de プログラミング - 頂点配列::glDrawElements
現在地 >> メニュー >> 基本編09 >> 頂点配列 >> glDrawElementsによる描画 >> 頂点配列::glDrawElements

問題


以下の配列データは立方体の各頂点データである。
glDrawElements関数を用いて、ワイヤーフレームで立方体を描画せよ。



float points[] ={
	0,0,0,  //v0
	1,0,0,  //v1
	1,1,0,  //v2
	0,1,0,  //v3

	0,0,-1, //v4
	1,0,-1, //v5
	1,1,-1, //v6
	0,1,-1, //v7
};

答え

#include <GL/glut.h>

float points[] ={
	0,0,0,  //v0
	1,0,0,  //v1
	1,1,0,  //v2
	0,1,0,  //v3

	0,0,-1, //v4
	1,0,-1, //v5
	1,1,-1, //v6
	0,1,-1, //v7
};

GLuint index[]={
	0,1,2,3,
	1,5,6,2,
	5,4,7,6,
	4,0,3,7,
	4,5,1,0,
	3,2,6,7
};

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

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

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

void MY_INIT()
{
	glClearColor(1.0, 1.0, 1.0, 1.0);
	glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}


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

	return 0;
}

//----------- ここからコールバック ---------------//
void display()
{
	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); //視点の設定

	DRAW();  //描画

	glutSwapBuffers();  //ウィンドウに出力

}

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 DRAW()
{
	glColor3d(1,0,1);
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3, GL_FLOAT, 0, points); //1頂点は3つで構成、float型、オフセット0、データ元
	glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, index);
	glDisableClientState(GL_VERTEX_ARRAY);
	glColor3d(1,1,1);
}