24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1051  |  回复: 8
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

sukiyq

木虫 (小有名气)

[求助] OpenGL里全局变量引起的奇怪的问题

下边是一个光照的OpenGL示例程序,运行有错误,把程序里完全没有用到的全局变量“GLfloat light_pos[] = {1.0, 2.0, 3.0, 0.0};”一行删除运行就正常了。这是为什么?明明这个全局变量并没有用到,但是设置了它程序就会出错,好奇怪。

#include
        GLfloat vertices[][3] = {{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},
        {1.0,1.0,-1.0}, {-1.0,1.0,-1.0}, {-1.0,-1.0,1.0},
        {1.0,-1.0,1.0}, {1.0,1.0,1.0}, {-1.0,1.0,1.0}};


        GLfloat colors[][4] = {{1.0,0.0,0.0,0.5},
        {0.0,1.0,1.0,0.5}, {1.0,1.0,0.0,0.5},
        {0.0,1.0,0.0,0.5}, {0.0,0.0,1.0,0.5}, {1.0,0.0,1.0,0.5}};
        GLfloat light_pos[] = {1.0, 2.0, 3.0, 0.0};

void polygon(int a, int b, int c , int d)
{
        glColor4fv(colors[a]);
        if(colors[a][4] != 1.0) glDepthMask(GL_TRUE);
                else glDepthMask(GL_FALSE);
        glBegin(GL_POLYGON);
                glVertex3fv(vertices[a]);
                glVertex3fv(vertices);
                glVertex3fv(vertices[c]);
                glVertex3fv(vertices[d]);
        glEnd();
}

void cube()
{
        polygon(0,3,2,1);
        polygon(2,3,7,6);
        polygon(3,0,4,7);
        polygon(1,2,6,5);
        polygon(4,5,6,7);
        polygon(5,4,0,1);
}

static GLfloat theta[] = {0.0,0.0,0.0};
static GLint axis = 2;

void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        glRotatef(theta[0], 1.0, 0.0, 0.0);
        glRotatef(theta[1], 0.0, 1.0, 0.0);
        glRotatef(theta[2], 0.0, 0.0, 1.0);
        cube();
        glutSwapBuffers();
}

void spinCube()
{
        theta[axis] += 2.0;
        if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
        glutPostRedisplay();
}

void mouse(int btn, int state, int x, int y)
{
        if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0;
        if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1;
        if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}

void myReshape(int w, int h)
{
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (w <= h)
        glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
            2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
    else
        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
            2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
    glMatrixMode(GL_MODELVIEW);
}

void
main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500, 500);
    glutCreateWindow("colorcube";
    glutReshapeFunc(myReshape);
    glutDisplayFunc(display);
    glutIdleFunc(spinCube);
    glutMouseFunc(mouse);
    glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glutMainLoop();
}
回复此楼
比菜鸟强一点点
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sukiyq

木虫 (小有名气)

引用回帖:
2楼: Originally posted by conanwj at 2012-09-10 20:16:48
出错信息是什么?
请贴出来。

没有出错信息,就是加上上边那句,绘制的立方体不能正常显示,运动后旧面会被新面覆盖;不加上边那句就可以正常显示和刷新。
比菜鸟强一点点
3楼2012-09-10 22:12:04
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 9 个回答

conanwj

版主 (著名写手)

【答案】应助回帖

感谢参与,应助指数 +1
出错信息是什么?
请贴出来。
2楼2012-09-10 20:16:48
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

小鸟袅袅

新虫 (正式写手)

【答案】应助回帖

感谢参与,应助指数 +1
glVertex3fv(vertices);
glutCreateWindow("colorcube";
修改为:
  glVertex3fv(vertices);
glutCreateWindow("colorcube";
其他任何地方不修改,结果显示一个旋转的正方形
(这与你设置的窗口有关系,如果为视图窗口显示为立方体)
4楼2012-09-11 09:03:36
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

conanwj

版主 (著名写手)

【答案】应助回帖

★ ★ ★
sukiyq: 金币+3, 有帮助 2012-09-23 09:10:56
引用回帖:
3楼: Originally posted by sukiyq at 2012-09-10 22:12:04
没有出错信息,就是加上上边那句,绘制的立方体不能正常显示,运动后旧面会被新面覆盖;不加上边那句就可以正常显示和刷新。...

编译过程中,
void polygon(int a, int b, int c , int d)函数的
glVertex3fv(vertices);此句错误,
应改为glVertex3fv(vertices);

在鼠标左键拖动立方体后,光照会造成立方体局部黑暗。
LZ所说的那句代码是否加上效果都是一样的。
请检查代码,加入合适的光照不吧。。
5楼2012-09-11 09:06:43
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见