現在地: メニュー >> 発展編08 >> 発展編08::まとめコード1

問題

答え

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


//VAO用ID
GLuint VaoId[1];

//VBO用ID
GLuint VboId[1];



//------------ プロトタイプ宣言 --------------//
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("Vertex Array Object");
}

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

	GLenum err = glewInit();
	if (err != GLEW_OK){
		std::cerr << glewGetErrorString(err) << "\n";
		return false;
	}

	if(!glewIsExtensionSupported("GL_ARB_vertex_array_object"))
	{
		std::cout << "GL_ARB_vertex_array_object : BAD \n";
		return false;
	}

	
	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()
{
	glBindVertexArray(VaoId[0]);//0番目のVAOにする
	glDrawArrays(GL_QUADS,0,4*6);
	glBindVertexArray(0);
}


//--------------------------//
void BuildVBO()
{
	glGenVertexArrays(1,&VaoId[0]);
	glBindVertexArray(VaoId[0]);

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

	//頂点
	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(1, &VboId[0]);
		VboId[0] = 0;
		exit(0);
	}

	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	glColorPointer(3,GL_FLOAT, 0, (void*)(sizeof(PointAry)+sizeof(NormalAry)));//色
	glNormalPointer(GL_FLOAT, 0, (void*)sizeof(PointAry));//法線
	glVertexPointer(3, GL_FLOAT, 0, 0); //頂点座標

	glBindBuffer(GL_ARRAY_BUFFER, 0);
	glBindVertexArray(0);
        
}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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