使用glNewList和glDrawElements的OpenGL
我有我的代码编译和工作,但我不确定它是否偶然工作。事情是,在我的初始化函数我启用顶点数组,然后定义一个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);
}
所以,问题是:将这项工作在任何情况下?
号
这是一个好的方法吗?
不!
显示列表只存储OpenGL命令及其参数,但不存储顶点数组的数据。事实上,如果你阅读了OpenGL显示列表上的任何体面教程,它应该明确警告不要混合顶点数组和显示列表,因为这是不可能的。
事实上,你根本不应该使用显示列表。请忘记你对它们所知道的一切,并忽略它们。如果你不得不问为什么?因为:显示列表已被完全从现代OpenGL中删除。不要使用它们,它们是过去的事情。他们最后一次有用的申请有时是15年前。
我不使用显示列表,因为它是一项学术工作。好的,所以不要混合显示列表和顶点数组。谢谢,我会接受。 – user1754322 2014-11-06 18:20:04
你能给一些参考吗?我一直在研究它,但是在OpenGL规范中找不到任何东西来说这不被支持。只是说**不这样做**适用于新代码,但我遇到了一些遗留的OpenGL代码的调试,并发现它在某些情况下工作,具体取决于OpenGL实现。 – ideasman42 2015-06-22 23:22:30
@ ideasman42:在任何OpenGL规范中查看大于或等于版本3.0的版本,请参阅关于弃用模型的附录部分。版本3.3以后定义了内核和兼容性配置文件,在核心规范中,附录部分详细说明了哪些功能已被删除。在3.3核心规范部分E.2.2的情况下, 346ff – datenwolf 2015-06-23 21:45:34
你根本不应该使用displayLists,而是使用VBOs,整个glbegin/glend管道被弃用为VBOs – 2014-11-06 08:59:07
我知道,但这是一项学术工作。 – user1754322 2014-11-06 18:13:40