我有我的代码编译和工作,但我不确定它是否偶然工作。事情是,在我的初始化函数我启用顶点数组,然后定义一个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);
}
你根本不应该使用displayLists,而是使用VBOs,整个glbegin/glend管道被弃用为VBOs – 2014-11-06 08:59:07
我知道,但这是一项学术工作。 – user1754322 2014-11-06 18:13:40