我有我的代码编译和工作,但我不确定它是否是偶然的工作。问题是,在我的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();
}执行显示时,数组已经关闭!因此,我不确定这在任何情况下是否可行。另一方面,我已经了解到,如果使用glNewList标志调用GL_COMPILE,则会保存编译时的状态。因此,可能是因为在编译时启用了顶点数组,然后在调用列表时启用。
所以,问题是:这种做法在任何情况下都能奏效吗?这是个好方法吗?
在这里,完整的代码:
#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);
}发布于 2014-11-06 09:38:02
所以,问题是:这种做法在任何情况下都能奏效吗?
不是的。
这是个好方法吗?
不是的!
显示列表只存储OpenGL命令及其参数,而不存储顶点数组的数据。事实上,如果您阅读过任何关于OpenGL显示列表的适当教程,它应该明确警告不要混合顶点数组和显示列表,因为这是不可能的。
实际上,您根本不应该使用显示列表。请忘记你所知道的关于他们的一切,忽略他们。如果你要问为什么?因为:显示列表已经被完全从现代OpenGL中删除。不要使用它们,它们是过去的东西。他们最后一次有用的应用是在15年前。
https://stackoverflow.com/questions/26775268
复制相似问题