zoukankan      html  css  js  c++  java
  • 在Visual Studio 2015中运行OPENGL

    Starting an OpenGL project in VS 2015 is really easy, thanks to the NupenGL.Core nuget package.

    Here are really quick steps to start your first OpenGL project using the FreeGlut library to provide a Window toolkit.

    Open Visual Studio 2015 Community Edition and create a new Visual Studio C++ Windows Console Application.

    OpenGLConsole

    Keep it simple. Choose an empty project template.

    EmptyProject

    Install the NupenGL.Core nuget package. From Visual Studio, Go to Tools NuGet Package Manager Manage Nuget Packages for this solution. Search for “NupenGL” and install the package.

    NupenGL-0.1.0.1

    测试代码:

    // source: http://jingyan.baidu.com/article/d5c4b52bca5005da560dc5d6.html
    #include <GL/glut.h>
    #include <stdlib.h>
    #include <math.h>
    #include <stdio.h>
    
    static int year = 0, spin = 0, day = 0;
    static GLint fogMode;
    const int n = 100;
    const GLfloat R = 1.0f;
    const GLfloat Pi = 3.1415926536f;
    
    void DrawCircle() {
    
        int  i;
        glClear(GL_COLOR_BUFFER_BIT);
        glBegin(GL_LINE_LOOP);
    
        for (i = 0; i < n; ++i)
        {
            glColor3f(1.0, 0.0, 0.0);
            glVertex2f(R*cos(2 * Pi / n*i), R*sin(2 * Pi / n*i));
        }
    
        glEnd();
        glFlush();
    }
    
    void init(void) {
        GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 };
        glEnable(GL_DEPTH_TEST);                          //防止遮挡
        glLightfv(GL_LIGHT0, GL_POSITION, position);
        glEnable(GL_LIGHTING);
        glEnable(GL_LIGHT0);
    
        {
            GLfloat mat[3] = { 0.1745, 0.01175, 0.01175 };
            glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
            mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136;
            glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
            mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959;
            glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
            glMaterialf(GL_FRONT, GL_SHININESS, 0.6*128.0);
        }
    
        glEnable(GL_FOG);
    
        {
            GLfloat fogColor[4] = { 0.5, 0.5, 0.5, 1.0 };
            fogMode = GL_EXP;
            glFogi(GL_FOG_MODE, fogMode);
            glFogfv(GL_FOG_COLOR, fogColor);
            glFogf(GL_FOG_DENSITY, 0.35);
            glHint(GL_FOG_HINT, GL_DONT_CARE);
            glFogf(GL_FOG_START, 1.0);
            glFogf(GL_FOG_END, 5.0);
        }
    
        glClearColor(0.5, 0.9, 0.9, 1.0);  /* fog color */
    
    }
    
    void display(void) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3f(0.0, 1.0, 1.0);
        glPushMatrix(); //记住自己的位置
        glutSolidSphere(1.0, 20, 16);   /* 画太阳半径、 20经度、16纬度*/
        glRotatef(spin, 0.0, 1.0, 0.0);  //自转,绕着一个向量以给定角度旋转(正的为逆时针)
        glTranslatef(2.0, 1.0, 0.0);
        glRotatef(spin, 1.0, 0.0, 0.0); //公转
        glRectf(0.1, 0.1, 0.5, 0.5);
        glColor3f(0.0, 0.0, 1.0);
        glutWireSphere(0.2, 8, 8);    /* 画第一颗小行星 */
        glColor3f(1.0, 0.0, 0.0);
        glTranslatef(2.0, 1.0, 0.0);
        glRotatef(2 * spin, 0.0, 1.0, 0.0);
        glutSolidSphere(0.5, 16, 8);
        glPopMatrix();//回到原来的位置
        glutSwapBuffers();
    }
    
    void spinDisplay(void) {
        spin = spin + 2;
        if (spin > 360)
            spin = spin - 360;
        glutPostRedisplay();
    }
    
    void mouse(int button, int state, int x, int y) {
        switch (button)
        {
        case GLUT_LEFT_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(spinDisplay);
            break;
    
        case GLUT_MIDDLE_BUTTON:
            if (state == GLUT_DOWN)
                glutIdleFunc(NULL);
            break;
    
        default:
            break;
        }
    
    }
    
    void reshape(int w, int h) {
        glViewport(0, 0, (GLsizei)w, (GLsizei)h);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 0.5, 20.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0.0, 10.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    }
    
    void keyboard(unsigned char key, int x, int y) {
        switch (key) {
        case 'd':
            day = (day + 10) % 360;
            glutPostRedisplay();
            break;
        case 'D':
            day = (day - 10) % 360;
            glutPostRedisplay();
            break;
        case 'y':
            year = (year + 5) % 360;
            glutPostRedisplay();
            break;
        case 'Y':
            year = (year - 5) % 360;
            glutPostRedisplay();
            break;
        case 27:
            exit(0);
            break;
        default:
            break;
        }
    }
    
    int main(int argc, char** argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
        glutInitWindowSize(400, 400);
        glutInitWindowPosition(100, 100);
        glutCreateWindow("OpengGL 程序设计--这段代码是我抄的");
        init();
        //glutDisplayFunc(DrawCircle);
        glutDisplayFunc(display);
        glutReshapeFunc(reshape);
        //glutKeyboardFunc(keyboard);
        glutMouseFunc(mouse);
        glutMainLoop();
    
        return 0;
    }
  • 相关阅读:
    最长公共子序列-动态规划
    归并排序
    最大子段和-3种方法
    kafka compaction 分析(基于kafka 0.10.2版本)
    [转载]interp1
    [转]mat2gray函数原理分析
    Java 位运算(移位、位与、或、异或、非)与逻辑运算
    ML01a
    [第1集] 机器学习的动机与应用
    tap4fun公司面试总结
  • 原文地址:https://www.cnblogs.com/hjlweilong/p/5603945.html
Copyright © 2011-2022 走看看