Visual Studio中使用NuGet设置OpenGL(有网络情况下)

撰写于:2018年12月18日
前面写过两篇博文,一篇是使用Visual Studio Express 2013设置OpenGL环境,还有一篇是使用CodeBlocks 16.01设置OpenGL开发环境。
其实,当我们使用Visual Studio时,还有更简单的办法。那就是使用VS的NuGet包管理器

一、系统环境

  • Windows 10
  • Visual Studio Express 2013

如果你的是老版本的Visual Sutdio,例如Visual Studio 2008及以下,是不能使用NuGet的,请关闭这篇博文,参看前面的【使用Visual Studio Express 2013设置OpenGL环境】

  • 联网,能够访问互联网,非常重要,没网络的话,无法下载Nupengl。

二、安装Visual studio Express 2013

(1)下载Visual studio express 2013

Express版本是免费的学习版,功能对于初学者是足够的。使用期为30天,30天后需要使用Microsoft账号登录才能继续使用。
Visual studio Express 2013 的下载地址请到这里搜索,下载前请登录你的Microsoft账号(或hotmail邮箱):
https://my.visualstudio.com/Downloads/Featured
选择Visual studio express 2013 for desktop这个版本,不带update的版本,安装包比较小。
记得选择DVD格式,这是离线安装包。(如果选择默认的exe,是在线安装的)。我们下载离线安装包,以便以后使用。

search_Visual studio express 2013 for desktop

(2)安装Visual studio Express 2013

安装没什么好说的,直接安装到默认的目录即可。安装完成后在C:\Program Files (x86)\Microsoft Visual Studio 12.0这个目录。

Visual stuido Express 2013 information

三、使用NuGet

(1)创建一个Visual C++的项目,空项目与不是空项目都行,为了方便演示,就创建一个空的项目。

【File】-【New Project】-【Visual C++】-【Win32】-【Win32 Console Application】,点击【OK】按钮,
点击【Next】,勾选【Empty project】,然后点击【Finish】,这样就创建了一个空的C++控制台项目了。

(2)安装NuPenGL

点击菜单栏【TOOLS】->【Library Package Manager】->【Manage NuGet Packages for Solution】,如下图所示,输入NuPenGL,可以看到两个搜索结果。

Manage NuGet Packages for Solution

可以看到nupengl core的介绍:

NupenGL is a Nuget package containing a collection of commonly used OpenGL libraries. Install it and you should be ready to use:

  • OpenGL
  • FreeGLUT
  • GLFW
  • GLEW
    上面的意思是说,NupenGL是一些常用的OpenGL库的集合,它包含了OpenGL、FreeGLUT、GLFW、GLEW一些常用的图形库。
    同时也可以看到,Nupengl Core依赖于 Nupengl Core Redist,所以,我们安装Nupengl Core时,会自动安装依赖项Nupengl Core Redist。

点击Nupengl Core旁边的【Install】按钮即可安装,会弹出选择为哪个项目/Project 安装Nupengl,这里我选择刚才新建的项目,点击【OK】即可开始安装。安装完毕后点击【Close】关闭。


select_project

四、测试安装

下面添加一个测试文件,来看OpenGL是否测试成功。
在项目上右键单击,选择【Add】-【New Item】-【Visual C++】-【C++ File(.cpp)】,然后输入一个名字test.cpp,点击【Add】按钮添加一个文件名为test.cpp的源文件。
打开源文件,复制如下代码到编辑器:

#include <gl/glut.h>
 
GLfloat rx=0, ry=0 ,angle=0;
GLint winWidth=600, winHeight=600;
GLint mouseDx,mouseDy;

//////////显示函数
void Display(){
    ////////GL_COLOR_BUFFER_BIT(用背景颜色填充)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    //glPushMatrix();
    glRotatef(1, rx, ry, 0); 
    glColor3f(0.0,0.0,1.0);
    //glutWireTeapot(160);
    glutSolidTeapot(120);
    //glPopMatrix(); 
    //交换缓冲区
    glutSwapBuffers();
    //glFlush();// 刷新绘图命令
}
 
 
// 设置渲染状态(听起来满下人,实际上很简单)
void SetupRC(void)
{
    //清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景颜色
    //和glColor4f(1.0f, 0.0f, 0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
    //最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
    glClearColor(1.0f, 1.0f, 1.0f,1.0f);
}
 
// 当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,
//几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧
void ChangeSize(int w, int h)
{
    winWidth = w;
    winHeight = h;
    // 设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)
    glViewport(0,0,w,h);
    // 重置坐标系统,指定设置投影参数
    glMatrixMode(GL_PROJECTION);
    ///////调用单位矩阵,去掉以前的投影参数设置
    glLoadIdentity();
        //////设置投影参数
    glOrtho(-w/2,w/2,-h/2,h/2,-w,w);
     
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
}
 
 
void init() //初始化背景颜色,光照,材质等 
{
    glClearColor(0.9,0.9,0.8,1.0); //初始背景色 
    /********* 光照处理 **********/ 
    GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
    GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat light_position0[] = { 100.0, 100.0, 100.0 ,0 }; 
    //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),
    //如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为 
    //平行光。 
    glLightfv(GL_LIGHT0, GL_AMBIENT , light_ambient ); //环境光 
    glLightfv(GL_LIGHT0, GL_DIFFUSE , light_diffuse ); //漫射光 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); //镜面反射 
    glLightfv(GL_LIGHT0, GL_POSITION, light_position0); //光照位置 
    /******** 材质处理 ***********/ 
    GLfloat mat_ambient[] = { 0.0, 0.2, 1.0, 1.0 };
    GLfloat mat_diffuse[] = { 0.8, 0.5, 0.2, 1.0 }; 
    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
    GLfloat mat_shininess[] = { 100.0 }; //材质RGBA镜面指数,数值在0~128范围内 
     
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
    glEnable(GL_LIGHTING); //启动光照 
    glEnable(GL_LIGHT0); //使第一盏灯有效 
    glEnable(GL_DEPTH_TEST); //测试深度缓存 
    /******** 其他可选项 ***********/ 
    // glDepthFunc(GL_LESS); //函数指定比较函数,用来比较每个引入象素的z值和深度缓存中给定的z值,只有当
    //激活深度检验时才执行此比较。 
    // glEnable(GL_CULL_FACE); //剔除多边形表面:在三维空间中,一个多边形虽然有两个面,但我们无法看见背
    //面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将
    //无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。
    //在这种时候,可以将不必要的面剔除。
    // glCullFace(GL_FRONT); //glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示
    //剔除正面、剔除反面、剔除正反两面的多边形。
    // glEnable(GL_COLOR_MATERIAL); //材质颜色追踪当前颜色
} 
 
 
/////////////////鼠标点击
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
    if(button==GLUT_LEFT_BUTTON && action==GLUT_DOWN)
    {
        mouseDx = xMouse;
        mouseDy = yMouse;
    }
    if(button==GLUT_LEFT_BUTTON && action==GLUT_UP)
    {
        glutPostRedisplay();
    }
}

////////////////鼠标移动
void MouseMove(GLint xMouse,GLint yMouse)
{
    //angle+=2;
    if(xMouse>mouseDx && yMouse==mouseDy)
    {
        rx=0;
        ry=1;}
    else if(xMouse<mouseDx && yMouse==mouseDy)
    {
        rx=0;
        ry=-1;
    }
    else if(xMouse==mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=0;
    }
    else if(xMouse==mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=0;
    }
    else if(xMouse>mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=1;
    } 
    else if(xMouse>mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=1;
    }
    else if(xMouse<mouseDx && yMouse<mouseDy)
    {
        rx=-1;
        ry=-1;
    }
    else if(xMouse<mouseDx && yMouse>mouseDy)
    {
        rx=1;
        ry=-1;
    }
           
    mouseDx = xMouse;
    mouseDy = yMouse;
    glutPostRedisplay();
}
 
// 主函数
int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    //设置显示模式
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    //设置窗口大小像素
    glutInitWindowSize(600, 600);
    ////设置窗口出现在屏幕的位置
    glutInitWindowPosition(300,160);
    //建立一个叫OpenGL的窗口
    glutCreateWindow("鼠标旋转的茶壶");
     
    //调用函数Display进行绘制
    glutDisplayFunc(Display);
        //////调用鼠标移动函数
        //glutPassiveMotionFunc(PassiveMouseMove);
    glutMotionFunc(MouseMove);
    //////调用鼠标点击函数
    glutMouseFunc(MousePlot);
     
    //如果窗口大小改变则调用函数ChangeSize重新进行绘制
    glutReshapeFunc(ChangeSize);
     
        init();
     
    //清屏
    //SetupRC();
    //循环绘制
    glutMainLoop();
     
    return 0;
}

按下Ctrl+F5,直接运行程序(不调试),可以看到绘制了如下一个茶壶,并且可以使用鼠标旋转,说明该项目的OpenGL设置成功。

teaport运行结果

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容