現在地 >> メニュー >> 基本編09 >> 頂点配列 >> glDrawElementsによる描画 >> 頂点配列::glDrawElements_2

問題


頂点配列::glDrawArrays_2のプログラムをglDrawElementsをつかって実行せよ。

答え

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


GLubyte index[]={
	0,1,2,3,
	4,5,6,7,
	8,9,10,11,
	12,13,14,15,
	16,17,18,19,
	20,21,22,23
};


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


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

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();
	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()
{
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);

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

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

【メモ】
注意点として、以下の図のように1つの頂点が複数の法線を持つ場合、
インデックス形式のでは、その分だけ定義が必要である。





今回のプログラムの場合、データがすでに描画順にならんでいるので、
インデックスは単純に0,1,2,...となるだけである

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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