[英]OpenGL using glNewList and glDrawElements
我已經編譯並工作了我的代碼,但是我不確定它是不是偶然地工作。 關鍵是,在我的init函數中,我啟用了頂點數組,然后定義了glNewList,最后我禁用了頂點數組。
void init(){
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
doubleStar = glGenLists(1);
glNewList(doubleStar, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix();
glColor3f(0, 0, 0.7);
// outside
glPushMatrix();
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, indices);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, &indices[8]);
glPopMatrix();
// inside
glPushMatrix();
glRotatef(30, 0, 0, 1);
glScalef(0.4, 0.4, 0.4);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, indices);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, &indices[8]);
glPopMatrix();
glPopMatrix();
glPopAttrib();
glEndList();
glDisableClientState(GL_VERTEX_ARRAY);
glutDisplayFunc(display);
}
在顯示函數中,我調用glCallList:
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// top left
glPushMatrix();
glTranslatef(-0.5, 0.5, 0);
glRotatef(15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// top right
glPushMatrix();
glTranslatef(0.5, 0.5, 0);
glRotatef(-15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// bot left
glPushMatrix();
glTranslatef(-0.5, -0.5, 0);
glRotatef(-15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// bot right
glPushMatrix();
glTranslatef(0.5, -0.5, 0);
glRotatef(15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
glFlush();
glutSwapBuffers();
}
執行顯示時,陣列已關閉! 因此,我不確定這是否在任何情況下都有效。 另一方面,我讀到如果您使用GL_COMPILE標志調用glNewList,則會保存編譯時的狀態。 因此,可能是因為在編譯時啟用了頂點數組,然后在調用列表時將啟用了該數組。
所以,問題是:在任何情況下都行得通嗎? 這是一個好方法嗎?
這里是完整的代碼:
#include <GL/glut.h>
#include <cmath>
void init();
void diplay();
static const GLfloat rInt = 0.7;
static const GLfloat rExt = 1;
static const GLuint indices[] =
{
4, 1, 3, 0, 5, 2, 4, 1,
10, 7, 9, 6, 11, 8, 10, 7
};
static const GLfloat vertices[] =
{
0, rInt, 0,
-cos(M_PI_2/3)*rInt, -sin(M_PI_2/3)*rInt, 0,
cos(M_PI_2/3)*rInt, -sin(M_PI_2/3)*rInt, 0,
0, rExt, 0,
-cos(M_PI_2/3)*rExt, -sin(M_PI_2/3)*rExt, 0,
cos(M_PI_2/3)*rExt, -sin(M_PI_2/3)*rExt, 0,
// 6
0, -rInt, 0,
-cos(M_PI_2/3)*rInt, sin(M_PI_2/3)*rInt, 0,
cos(M_PI_2/3)*rInt, sin(M_PI_2/3)*rInt, 0,
0, -rExt, 0,
-cos(M_PI_2/3)*rExt, sin(M_PI_2/3)*rExt, 0,
cos(M_PI_2/3)*rExt, sin(M_PI_2/3)*rExt, 0
};
static GLuint doubleStar;
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(600, 600);
glutInitWindowPosition(64, 64);
glutCreateWindow("Mosaico estrella");
init();
glutMainLoop();
return 0;
}
void display(){
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
// top left
glPushMatrix();
glTranslatef(-0.5, 0.5, 0);
glRotatef(15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// top right
glPushMatrix();
glTranslatef(0.5, 0.5, 0);
glRotatef(-15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// bot left
glPushMatrix();
glTranslatef(-0.5, -0.5, 0);
glRotatef(-15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
// bot right
glPushMatrix();
glTranslatef(0.5, -0.5, 0);
glRotatef(15, 0, 0, 1);
glScalef(0.5, 0.5, 0.5);
glCallList(doubleStar);
glPopMatrix();
glFlush();
glutSwapBuffers();
}
void init(){
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertices);
doubleStar = glGenLists(1);
glNewList(doubleStar, GL_COMPILE);
glPushAttrib(GL_CURRENT_BIT);
glPushMatrix();
glColor3f(0, 0, 0.7);
// outside
glPushMatrix();
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, indices);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, &indices[8]);
glPopMatrix();
// inside
glPushMatrix();
glRotatef(30, 0, 0, 1);
glScalef(0.4, 0.4, 0.4);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, indices);
glDrawElements(GL_TRIANGLE_STRIP, 8, GL_UNSIGNED_INT, &indices[8]);
glPopMatrix();
glPopMatrix();
glPopAttrib();
glEndList();
glDisableClientState(GL_VERTEX_ARRAY);
glutDisplayFunc(display);
}
所以,問題是:在任何情況下都行得通嗎?
沒有。
這是一個好方法嗎?
沒有!
顯示列表僅存儲OpenGL命令及其參數,而不存儲頂點數組的數據。 實際上,如果您閱讀了有關OpenGL顯示列表的任何不錯的教程,它應該明確警告不要混合頂點數組和顯示列表,因為這不可能正確。
實際上,您根本不應使用顯示列表。 請忘記您對它們的了解並忽略它們。 如果您要問為什么? 因為: 顯示列表已被廢棄,已完全從現代OpenGL中刪除。 不要使用它們,它們是過去的東西。 他們最后一次有用的應用有時是15年左右。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.