OpenGLラーニング12:表示リスト
8181 ワード
OPENGLの関数を保存して後で使用できるため、リストを表示するとパフォーマンスが向上します.同じジオメトリを複数回再描画する必要がある場合、または状態を変更するために複数回呼び出す必要がある関数を表示リストに保存する必要がある場合(表示リストのマトリクス結果セットを保存し、その後の使用では計算を繰り返してパフォーマンスを向上させる必要はありません)ネットワークを介して別のリモートコンピュータ上でOPENGLプログラムを演算する場合、ペイントコマンドを表示リストに保存することは特に重要な意義がある.表示リストはサーバの一部であるため、ネットワーク通信を低減することができ、パフォーマンスを向上させる表示リストは動的データベースではなくコマンドバッファのようなものである.すなわち、表示リストが作成されると、修正できません.同時に、表示リストの作成にもシステムオーバーヘッドがあるため、小さな表示リストがパフォーマンスを向上させるとは限らない.
名前と作成、表示リストの実行
1.請求インデックス値 Gluint listName = glGenLists (Glsizei range); range個の連続を割り当て、以前は割り当てられていなかった表示リストインデックス、戻り値は連続インデックスの開始2.表示リストの開始を指定する glNewList (listName, mode); mode:GL_COMPILE GL_COMPILE_AND_EXECUTE 3.OPENGL指令4.表示リスト定義終了 glEndList (); 5.表示リストの実行 glCallList (listName);
階層表示リストは、glNewList()とglEndList()の間でglCallList()を呼び出して他の表示リストを実行する表示リストである階層表示リストを作成することができる glNewList (listName, mode); glCallList (name1); glCallList (name2); glCallList (name3); glCallList (name4); glEndList (); 表示階層が最も少ないネスト階層は64で、GL_を介してより高い可能性があります.MAX_LIST_NESTING属性照会
管理表示リストインデックスGlboolean glIsList(Gluint list)void glDeleteLists(Gluint listm,Glsizei range)
複数の表示リストの実行 glListBase(base); glCallLists()関数の表示リストインデックス値と加算して、最終的な表示リストインデックスを取得するオフセット量を指定します.表示リストベースアドレスはglCallList()に対してglNewList()には効果がありません.glCallLists(GLsizei n,GLenum type,const GLvoid*lists);n個の表示リストtypeを実行する:GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_2_BYTES GL_3_BYTES GL_4_BYTESの例: base = glGenLists (128); glListBase(base); glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList(); glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList(); glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList(); char *test1 = "A SPARE SERAPE APPEARS AS"; GLsizei len = strlen(s); glCallLists(len, GL_BYTE, (GLbyte *)s);
表示リスト管理状態変数表示リストには、opengl状態変数の値を変更するための関数が含まれ、これらの値は表示リストの実行時に変更され、これらの値は表示リストの実行後も保持されます.簡単に言えば、表示リストにglColor(1,0,0)を設定すると、表示リストの実行が完了した後も設定の色が機能します.リストの変更が後で影響を及ぼさないように表示する場合があります.これには、プロパティを復元する必要があります. glNewList (listName, mode); glPushMatrix(); glPushAttrib(GL_CURRENT_BIT) ... do_some_draw(); glPopAttrib() glPopMatrix(); glEndList (); 表示リストDemo:
名前と作成、表示リストの実行
1.請求インデックス値 Gluint listName = glGenLists (Glsizei range); range個の連続を割り当て、以前は割り当てられていなかった表示リストインデックス、戻り値は連続インデックスの開始2.表示リストの開始を指定する glNewList (listName, mode); mode:GL_COMPILE GL_COMPILE_AND_EXECUTE 3.OPENGL指令4.表示リスト定義終了 glEndList (); 5.表示リストの実行 glCallList (listName);
階層表示リストは、glNewList()とglEndList()の間でglCallList()を呼び出して他の表示リストを実行する表示リストである階層表示リストを作成することができる glNewList (listName, mode); glCallList (name1); glCallList (name2); glCallList (name3); glCallList (name4); glEndList (); 表示階層が最も少ないネスト階層は64で、GL_を介してより高い可能性があります.MAX_LIST_NESTING属性照会
管理表示リストインデックスGlboolean glIsList(Gluint list)void glDeleteLists(Gluint listm,Glsizei range)
複数の表示リストの実行 glListBase(base); glCallLists()関数の表示リストインデックス値と加算して、最終的な表示リストインデックスを取得するオフセット量を指定します.表示リストベースアドレスはglCallList()に対してglNewList()には効果がありません.glCallLists(GLsizei n,GLenum type,const GLvoid*lists);n個の表示リストtypeを実行する:GL_BYTE GL_UNSIGNED_BYTE GL_SHORT GL_UNSIGNED_SHORT GL_INT GL_UNSIGNED_INT GL_FLOAT GL_2_BYTES GL_3_BYTES GL_4_BYTESの例: base = glGenLists (128); glListBase(base); glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList(); glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList(); glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList(); char *test1 = "A SPARE SERAPE APPEARS AS"; GLsizei len = strlen(s); glCallLists(len, GL_BYTE, (GLbyte *)s);
表示リスト管理状態変数表示リストには、opengl状態変数の値を変更するための関数が含まれ、これらの値は表示リストの実行時に変更され、これらの値は表示リストの実行後も保持されます.簡単に言えば、表示リストにglColor(1,0,0)を設定すると、表示リストの実行が完了した後も設定の色が機能します.リストの変更が後で影響を及ぼさないように表示する場合があります.これには、プロパティを復元する必要があります. glNewList (listName, mode); glPushMatrix(); glPushAttrib(GL_CURRENT_BIT) ... do_some_draw(); glPopAttrib() glPopMatrix(); glEndList (); 表示リストDemo:
#include "header.h"
GLuint listName;
static void init (void)
{
listName = glGenLists (1);
glNewList (listName, GL_COMPILE);
glColor3f (1.0, 0.0, 0.0);
glBegin (GL_TRIANGLES);
glVertex2f (0.0, 0.0);
glVertex2f (1.0, 0.0);
glVertex2f (0.0, 1.0);
glEnd ();
glTranslatef (1.5, 0.0, 0.0);
glEndList ();
glShadeModel (GL_FLAT);
}
static void drawLine (void)
{
glBegin (GL_LINES);
glVertex2f (0.0, 0.5);
glVertex2f (15.0, 0.5);
glEnd ();
}
void display(void)
{
GLuint i;
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (0.0, 1.0, 0.0);
for (i = 0; i < 10; i++)
glCallList (listName);
drawLine ();
glFlush ();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (0.0, 2.0, -0.5 * (GLfloat) h/(GLfloat) w,
1.5 * (GLfloat) h/(GLfloat) w);
else
gluOrtho2D (0.0, 2.0 * (GLfloat) w/(GLfloat) h, -0.5, 1.5);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 27:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(650, 50);
glutCreateWindow(argv[0]);
init ();
glutReshapeFunc (reshape);
glutDisplayFunc (display);
glutKeyboardFunc (keyboard);
glutMainLoop();
return 0;
}
複数の表示リストDemo #include "header.h"
#include <string.h>
#define PT 1
#define STROKE 2
#define END 3
typedef struct charpoint {
GLfloat x, y;
int type;
} CP;
CP Adata[] = {
{ 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
{5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END}
};
CP Edata[] = {
{5, 0, PT}, {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE},
{0, 5, PT}, {4, 5, END}
};
CP Pdata[] = {
{0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
{4, 5, PT}, {0, 5, END}
};
CP Rdata[] = {
{0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
{4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END}
};
CP Sdata[] = {
{0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT},
{4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT},
{4, 10, PT}, {5, 9, END}
};
static void drawLetter(CP *l)
{
glBegin(GL_LINE_STRIP);
while (1) {
switch (l->type) {
case PT:
if(l->y==0)
{
glColor3f(1.0,0.0,0.0);
}
glVertex2i(l->x,l->y);
break;
case STROKE:
glVertex2i(l->x,l->y);
glEnd();
glBegin(GL_LINE_STRIP);
break;
case END:
glVertex2i(l->x,l->y);
glEnd();
glTranslatef(8.0, 0.0, 0.0);
return;
}
l++;
}
}
GLuint base;
static void init (void)
{
GLuint base;
glShadeModel (GL_FLAT);
base = glGenLists (128);
glListBase(base);
glNewList(base+'A', GL_COMPILE); drawLetter(Adata); glEndList();
glNewList(base+'E', GL_COMPILE); drawLetter(Edata); glEndList();
glNewList(base+'P', GL_COMPILE); drawLetter(Pdata); glEndList();
glNewList(base+'R', GL_COMPILE); drawLetter(Rdata); glEndList();
glNewList(base+'S', GL_COMPILE); drawLetter(Sdata); glEndList();
glNewList(base+' ', GL_COMPILE); glTranslatef(8.0, 0.0, 0.0); glEndList();
}
char *test1 = "A SPARE SERAPE APPEARS AS";
char *test2 = "APES PREPARE RARE PEPPERS";
static void printStrokedString(char *s)
{
GLsizei len = strlen(s);
glCallLists(len, GL_BYTE, (GLbyte *)s);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
glScalef(2.0, 2.0, 2.0);
glTranslatef(10.0, 30.0, 0.0);
printStrokedString(test1);
glPopMatrix();
glPushMatrix();
glScalef(2.0, 2.0, 2.0);
glTranslatef(10.0, 13.0, 0.0);
printStrokedString(test2);
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluOrtho2D (0.0, (GLdouble) w, 0.0, (GLdouble) h);
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case ' ':
glutPostRedisplay();
break;
case 27:
exit(0);
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (440, 120);
glutCreateWindow ("stroke");
init ();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}