簡體   English   中英

OpenGL使用glNewList和glDrawElements

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM