2014-11-06 46 views
1

我有我的代码编译和工作,但我不确定它是否偶然工作。事情是,在我的初始化函数我启用顶点数组,然后定义一个glNewList并在最后禁用顶点数组。使用glNewList和glDrawElements的OpenGL

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

} 
+2

你根本不应该使用displayLists,而是使用VBOs,整个glbegin/glend管道被弃用为VBOs – 2014-11-06 08:59:07

+0

我知道,但这是一项学术工作。 – user1754322 2014-11-06 18:13:40

回答

2

所以,问题是:将这项工作在任何情况下?

这是一个好的方法吗?

不!

显示列表只存储OpenGL命令及其参数,但不存储顶点数组的数据。事实上,如果你阅读了OpenGL显示列表上的任何体面教程,它应该明确警告不要混合顶点数组和显示列表,因为这是不可能的。

事实上,你根本不应该使用显示列表。请忘记你对它们所知道的一切,并忽略它们。如果你不得不问为什么?因为:显示列表已被完全从现代OpenGL中删除。不要使用它们,它们是过去的事情。他们最后一次有用的申请有时是15年前。

+0

我不使用显示列表,因为它是一项学术工作。好的,所以不要混合显示列表和顶点数组。谢谢,我会接受。 – user1754322 2014-11-06 18:20:04

+0

你能给一些参考吗?我一直在研究它,但是在OpenGL规范中找不到任何东西来说这不被支持。只是说**不这样做**适用于新代码,但我遇到了一些遗留的OpenGL代码的调试,并发现它在某些情况下工作,具体取决于OpenGL实现。 – ideasman42 2015-06-22 23:22:30

+1

@ ideasman42:在任何OpenGL规范中查看大于或等于版本3.0的版本,请参阅关于弃用模型的附录部分。版本3.3以后定义了内核和兼容性配置文件,在核心规范中,附录部分详细说明了哪些功能已被删除。在3.3核心规范部分E.2.2的情况下, 346ff – datenwolf 2015-06-23 21:45:34

相关问题