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;
    }
  • 相关阅读:
    vue 跳转路由传参数用法
    百度地图放大之后,多边形,矩形覆盖物消失
    百度地图画多边形,画圆, 监听事件不触发原因
    兄弟组件之间如何通信
    vue如何触发某个元素的单击事件?
    input 清空值。(转载)
    inline-block元素水平居中问题
    android 浏览器对图片加载高度渲染问题
    IE下png图片黑边问题
    IE css hack整理
  • 原文地址:https://www.cnblogs.com/hjlweilong/p/5603945.html
Copyright © 2011-2022 走看看