美文网首页
c++ opengl绘制地球

c++ opengl绘制地球

作者: 一路向后 | 来源:发表于2024-08-09 20:29 被阅读0次

    1.源码实现

    #define GL_GLEXT_PROTOTYPES
    
    #include <GL/gl.h>
    #include <GL/glu.h>
    #include <GL/glut.h>
    #define STB_IMAGE_IMPLEMENTATION
    #include "stb_image.h"
    
    //void glGenerateMipmap (GLenum target);
    
    float angle = 0.0;
    
    GLuint textureID;
    
    void init()
    {
        glEnable(GL_DEPTH_TEST);
        glEnable(GL_MULTISAMPLE);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
        //glEnable(GL_TEXTURE_2D);
    
        glDepthFunc(GL_LEQUAL);
        glClearDepth(1.0f);
    
        GLfloat light_position[] = {1.0, -1.0, -0.5, 0.0};
        GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};
        GLfloat light_diffuse[] = {0.8, 0.8, 0.8, 1.0};
    
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
        glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    
        glEnable(GL_COLOR_MATERIAL);
    
        glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
    
        //生成纹理对象
        glGenTextures(1, &textureID);
    
        glBindTexture(GL_TEXTURE_2D, textureID);
    
        //加载图片并设置纹理参数
        int width, height, channels;
        unsigned char *image = stbi_load("earth.jpg", &width, &height, &channels, STBI_rgb);
    
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);
    
        glGenerateMipmapEXT(GL_TEXTURE_2D);
    
        stbi_image_free(image);
    }
    
    void update(int value)
    {
        angle += 2.0f;
    
        if(angle > 360)
        {
            angle -= 360;
        }
    
        glutPostRedisplay();
    
        glutTimerFunc(32, update, 0);
    }
    
    void drawSphere()
    {
        GLUquadric *quadric = gluNewQuadric();
        gluQuadricTexture(quadric, GL_TRUE);
        gluQuadricDrawStyle(quadric, GLU_FILL);
        gluQuadricOrientation(quadric, GLU_OUTSIDE);
        gluQuadricNormals(quadric, GLU_SMOOTH);
    
        gluSphere(quadric, 0.8, 50, 50);
    
        gluDeleteQuadric(quadric);
    }
    
    void display()
    {
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    
        glLoadIdentity();
        glRotatef(angle, 0.0f, 1.0f, 0.0f);
        glRotatef(angle, 0.0f, 0.0f, 1.0f);
    
        glEnable(GL_TEXTURE_2D);
    
        //glTranslatef(0.0f, 0.0f, -0.3f);
    
            glBindTexture(GL_TEXTURE_2D, textureID);
    
        //glutSolidCube(0.8);
        //glutSolidSphere(0.8, 50, 50);
    
        glBegin(GL_TRIANGLES);
    
        drawSphere();
    
        glEnd();
    
        glDisable(GL_TEXTURE_2D);
    
        glFlush();
    
        glutSwapBuffers();
    }
    
    int main(int argc, char **argv)
    {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_RGB|GLUT_DOUBLE|GLUT_DEPTH|GLUT_MULTISAMPLE);
        glutInitWindowSize(400, 400);
    
        glutCreateWindow("OpenGL Sphere with Lighting");
    
        init();
        glutDisplayFunc(display);
        glutTimerFunc(16, update, 0);
    
        glutMainLoop();
    
        return 0;
    }
    

    2.素材图片

    3.编译源码

    $ g++ -o example example.cpp -std=c++11 -I/opt/apps/wxwidget/include -L/opt/apps/wxwidget/lib -lGL -lglut -Wl,-rpath=/opt/apps/wxwidget/lib
    

    4.运行结果

    屏幕截图 2024-08-10 202538.png

    相关文章

      网友评论

          本文标题:c++ opengl绘制地球

          本文链接:https://www.haomeiwen.com/subject/qrdkkjtx.html