c++ - glutSolidSphere 没有被点亮

标签 c++ opengl freeglut

当我使用此代码示例时,我得到一个扁平的白色球体。

我期待一个从侧面照亮并旋转的球体。

#include <GL/glut.h>
#include <GL/freeglut.h>

int angle = 0;
int _refreshmilliseconds = (1 / 60) * 1000; // 60 frames a second

void timer(int value) {
        glutPostRedisplay();
        glutTimerFunc(_refreshmilliseconds, timer, 0);
}

void display(void) {
        /*
        OPEN GL AND GRAPHICS FUNCTIONALITY
        */
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();

        // Lighting
        // Ambient light
        GLfloat ambientCol[] = { 1.0f, 0.0f, 0.0f, 1.0f };
        glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientCol);

        // Positioned light
        GLfloat lightCol0[] = { 1.0f, 0.0f, 0.0f, 1.0f };
        GLfloat lightPos0[] = { 0.5f, 0.0f, 1.0f, 1.0f };

        glLightfv(GL_LIGHT0, GL_DIFFUSE, lightCol0);
        glLightfv(GL_LIGHT0, GL_POSITION, lightPos0);

        // Keyboard-controlled circle, player1
        glPushMatrix();
        glRotatef(angle, 1.0f, 1.0f, 0.0f);
        glutSolidSphere(0.5f, 20, 20);
        glPopMatrix();

        angle += 2;
    if (angle >= 360) { angle = 0; }

        glutSwapBuffers();
}

int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

        glEnable(GL_DEPTH_TEST);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        glEnable(GL_NORMALIZE);

        glutInitWindowSize(400, 400);                                           // Set window size
        glutInitWindowPosition(100, 100);                                       // Set window position
        glutCreateWindow("Embera 2.0.1");                                       // Create GLUT window

        glutDisplayFunc(display);
        glutTimerFunc(0, timer, 0);

        glutMainLoop();

        return 0;
}

为什么会出现这种情况?
enter image description here

最佳答案

问题是我的窗口创建的位置。我的任何 glEnable 调用都没有启动,因为它们是在我创建窗口之前放置的。为了解决这个问题,我只是移动了这一行:

glutCreateWindow("Embera 2.0.1");

所以主函数看起来像这样:

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("Embera 2.0.1");

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);

    glutInitWindowSize(400, 400);
    glutInitWindowPosition(100, 100);


    glutDisplayFunc(display);
    glutTimerFunc(0, timer, 0);

    glutMainLoop();

    return 0;

关于c++ - glutSolidSphere 没有被点亮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20169658/

相关文章:

c++ - 数据压缩器需要哪些数学知识?

c++ - 打印到文件和控制台 C++

c++ - OpenGL 相机 vector

opengl - freeglut 与 glew 的区别?

c++ - 使用 gluSphere() 和 gluCylinder() 渲染光滑的球体和圆柱体

c++ - QVariant 包装指针在 QML 中变为 null

c++ - 实现近似(基于特征)q 学习的问题

java - 如何在 JOGL 中编辑顶点着色器

c++ - 隐藏光标

c++ - 将 2D 对象更改为 3D 对象 OpenGl