首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL使用glNewList和glDrawElements

OpenGL使用glNewList和glDrawElements
EN

Stack Overflow用户
提问于 2014-11-06 08:55:14
回答 1查看 2.4K关注 0票数 1

我有我的代码编译和工作,但我不确定它是否是偶然的工作。问题是,在我的init函数中,我启用了顶点数组,然后定义了一个glNewList,最后禁用了顶点数组。

代码语言:javascript
复制
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:

代码语言:javascript
复制
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();

}

执行显示时,数组已经关闭!因此,我不确定这在任何情况下是否可行。另一方面,我已经了解到,如果使用glNewList标志调用GL_COMPILE,则会保存编译时的状态。因此,可能是因为在编译时启用了顶点数组,然后在调用列表时启用。

所以,问题是:这种做法在任何情况下都能奏效吗?这是个好方法吗?

在这里,完整的代码:

代码语言:javascript
复制
#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);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-06 09:38:02

所以,问题是:这种做法在任何情况下都能奏效吗?

不是的。

这是个好方法吗?

不是的!

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26775268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档