ProgrammingのTipなど

頂点配列


glVertex()は頂点ごとの描画ですが、頂点の数が多いと関数が呼び出される回数も多くなり
遅くなります。
頂点配列を使うと一度の呼び出しで良いのでパフォーマンスが改善されます
glEnableClientStateでデータの種類を決める
glEnableClientState(データの種類);
頂点かそれともインデックスなどを扱うのかデータの種類を設定します
GL_VERTEX_ARRAY     頂点の配列
GL_INDEX_ARRAY     インデックスの配列
GL_NORMAL_ARRAY     法線の配列
GL_TEXTURE_COORD_ARRAY テクスチャの配列
GL_COLOR_ARRAY     カラーの配列
GL_EDGE_FLAG_ARRAY   エッジフラグの配列
glXXXXXXPointerで配列を渡す
glVertexPointer(1頂点あたりの要素数 , 数字の型 , 1頂点のデータの間のサイズ数 , 配列のポインタ);
glDrawElementsによる描画

glDrawElements(描画の図形のタイプ , 描画する頂点の数 , データの数の型 , インデックスのポインタ);
実例
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3 , GL_FLOAT , 0 , vx);
glDrawElements(GL_TRIANGLES , 3 , GL_UNSIGNED_BYTE , ix);

全体
main.cpp
#include <GL/glut.h>   
#include <GL/gl.h>	
#include <GL/glu.h>	

const GLfloat vx[] = {
	-1,0,0, 0,1,0, 1,0,0
};
const GLubyte ix[] = { 0 , 1 , 2 };
   
void display()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();
	glTranslatef(0,0,-5);
	
	glColor3f(0,0,1);
	/*
	glBegin(GL_TRIANGLES);
		glVertex3f(-1,0,0);
		glVertex3f(0, 1,0);
		glVertex3f( 1,0,0);
	glEnd();
	*/
	glEnableClientState(GL_VERTEX_ARRAY);
	glVertexPointer(3 , GL_FLOAT , 0 , vx);

	glDrawElements(GL_TRIANGLES , 3 , GL_UNSIGNED_BYTE , ix);
	glutSwapBuffers();
}

void onKeyboard(unsigned char key, int x, int y)
{
	switch (key) {
		case '\033':   
			exit(0);
		default:
			break;
}
}

void onMouse(int button, int state, int x, int y)
{
	switch (button) {
		case GLUT_LEFT_BUTTON:
			break;
		case GLUT_MIDDLE_BUTTON:
			break;
		case GLUT_RIGHT_BUTTON:
			break;
		default:
			break;
	}
}


void onReshape(int width, int height)
{
	if (height==0) height=1;
	if (width==0) width=1;
	glViewport(0,0,width,height);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}

void timer(int value)
{
	glutPostRedisplay();
	glutTimerFunc(30 , timer , 0);
}

void glInit(void)
{
	glClearColor(0.9, 0.9, 0.9, 1.0);
	glShadeModel(GL_SMOOTH);
	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

int main(int argc, char **argv) 
{  
	glutInit(&argc, argv);  
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);  
	glutInitWindowSize(750,750);  
 
	int window = glutCreateWindow(argv[0]);
	glutDisplayFunc(display);
	glutReshapeFunc(onReshape);
	glutMouseFunc(onMouse);
	glutKeyboardFunc(onKeyboard);
	glutTimerFunc(50 , timer , 0);
	glInit();
	glutMainLoop();  
	return 1;
}
linux用makefile

SOURCE = main
EXTENSIONTYPE = cpp
INCLUDE = -I/usr/include/
LIBDIR  = -L/usr/X11R6/lib 
CC = g++
CFLAGS = 
LIBRARIES = -lglut -lGL -lGLU 
EXENAME = a
OBJ = $(SOURCE).o

all: $(OBJ)
	$(CC) $(CFLAGS) $(INCLUDE) -o $(EXENAME) $(LIBDIR) $(OBJ) $(LIBRARIES)

$(SOURCE).o: $(SOURCE).$(EXTENSIONTYPE)
	$(CC) $(CFLAGS) $(INCLUDE) -c $^ $(LIBDIR) $(LIBRARIES)	


clean:
	rm $(OBJ) $(EXENAME) 

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

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