zoukankan      html  css  js  c++  java
  • vc如何编译链接opengl库

    强烈推荐的一篇强大的OpenGl学习博文OpenGL入门学习

    vc2012如何链接opengl库?

    首先,我们需要下载opengl的库文件,http://pan.baidu.com/s/1kTsjkZP

    找到vc2012的安装路径

    .h文件扔到VCinclude中。 

    .lib文件扔到VClib中。

    .dll文件扔到 c:windowssystem32中。


    接着,我们用VS2012建立C++的Win32控制台应用程序,其中选中空项目后,点击完成即可


    GLUT教程

    摘自 http://zhidao.baidu.com/link?url=JisxP3Caj8Vkrc0CTFb1IHDYcP1n2uQ919wrti33RNOH7wEIPSaEZqyecYulJMUnJX0-y4TIinedPUlxz-lb0K


    在这个部分我们将在我们的程序里建立一个main函数,这个main函数将完成必须的初始化和开启事件处理循环。所有的GLUT函数都有glut前缀并且那些完成一些初始化的函数有glutInit前缀。你首先要做的是调用函数glutInit()。

    Void glutInit(int*argc,char**argv);

    参数:

    Argc:一个指针,指向从main()函数传递过来的没更改的argc变量。

    Argv:一个指针,指向从main()函数传递过来的没更改的argv变量。

    在初始化GLUT后,我们开始定义我们的窗口。首先确定窗口位置(它默认的是屏幕左上角),我们使用函数glutInitWindowPosition()。

    Void glutInitWindowPositon(int x,int y);

    参数:

    X: 距离屏幕左边的像素数。-1是默认值,意思就是由窗口管理程序决定窗口出现在哪里。如果不使用默认值,那你就自己设置一个值。

    Y:距离屏幕上边的像素数。和X一样。

    注意,参数仅仅是对窗口管理程序的一个建议。尽管你精心的设置了窗口位置,window返回的可能是不同的位置。如果你设置了,一般会得到你想要的结果。接下来我们设置窗口大小,使用函数glutInitWindowSize()。

    Void glutInitWindowSize(int width,int height);

    参数:

    Width:窗口的宽度。

    Height:窗口的高度。

    同样width,height也只是一个参考数字。避免使用负数。

    接下来。你应该使用函数glutInitDisplayMode()定义显示方式。

    Void glutInitDisplayMode(unsighed int mode)

    参数:

    Mode――可以指定下列显示模式

    Mode参数是一个GLUT库里预定义的可能的布尔组合。你使用mode去指定颜色模式,数量和缓冲区类型。

    指定颜色模式的预定义常量有:

    1:GLUT_RGBA或者GLUT_RGB。指定一个RGBA窗口,这是一个默认的颜色模式。

    2:GLUT_INDEX。指定颜色索引模式。

    这个显示模式还允许你选择单缓冲区或双缓冲区窗口。

    1:GLUT_SINGLE.单缓冲区窗口。

    2:GLUT_BUFFER.双缓冲区窗口,这是产生流畅动画必须选的。

    还可以指定更多,如果你想指定一组特殊的缓冲的话,用下面的变量:

    1:GLUT_ACCUM.累积缓冲区。

    2:GLUT_STENCIL.模板缓冲区。

    3:GLUT_DEPTH.深度缓冲区。

    假定你想要一个有单缓冲区,深度缓冲区的RGB窗口,你用“或“(|)操作符来建立你想要的显示模式。

    …………….

    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE|GLUT|DEPTH);

    …………….

    经过上面的这些步骤后,就可以调用函数glutCreateWindow()来创建窗口了。

    Int glutCreateWindow(char* title);

    参数:

    Title:设置窗口的标题。

    glutCreateWindow()的返回值是一个窗口标识符。后面你可以在GLUT里使用这个标识符,不过这个超出了本小节的范围。

    现在就有一些代码来完成所有的初始化操作。

    #include<gl/glut.h>

    void main(int argc,char**argv)

    {

    glutInit(&argc,argv);

    glutInitDisplayMode(GLUT_DEPTH|GLUT_SINGLE|GLUT_RGBA);

    glutInitWindowPosition(100,100);

    glutInitWindowSize(320,320);

    glutCreateWindow(“GLUT Tutorial”);

    }

    如果你运行上述代码,你将会得到一个空的黑的控制台窗口,而没有OpenGL窗口。并且控制台窗口将很快消失。

    在我们渲染一些东西前,还有两件事需要处理。第一告诉GLUT哪个函数负责渲染。我们创建一个简单的渲染的函数。下面的这个函数将会清除颜色缓冲区并画一个三角形。

    ...
    void renderScene(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glVertex3f(-0.5,-0.5,0.0);
    glVertex3f(0.5,0.0,0.0);
    glVertex3f(0.0,0.5,0.0);
    glEnd();
    glFlush();
    }
    上面的函数的名字你可以自己取一个。现在你必须告诉GLUT使用我们上面的函数来进行渲染。这个叫寄存回调。。让我们告诉GLUT这个函数renderScene应该被使用。当需要重画的时候GLUT有一个只传递一个函数名称参数的函数(以函数名为形参的函数)就会被调用。
    void glutDisplayFunc(void (*func)(void));

    参数:

    func: 当窗口需要被重绘是调用的函数的名称。注意使用NULL作为实参是错误的。

    最后一件事是告诉GLUT我们准备进入应用程序事件处理循环。GLUT提供了一个函数让程序进入一个永不结束的循环。一直等待处理下一个事件。函数是glutMainLoop()。

    void glutMainLoop(void)

    到目前为止所有的代码都列在下面。如果你运行代码,将会得到一个控制台窗口,和一个画着一个白色三角形的OpenGL窗口,出现在你设置的位置,并有着你设置的尺寸。

    
    
    #include <GL/glut.h> 
    
    void renderScene(void) { 
             glClear(GL_COLOR_BUFFER_BIT); 
             glBegin(GL_TRIANGLES); 
                     glVertex3f(-0.5,-0.5,0.0); 
                     glVertex3f(0.5,0.0,0.0); 
                     glVertex3f(0.0,0.5,0.0); 
             glEnd(); 
             glFlush(); 
    } 
      
    void main(int argc, char **argv) { 
             glutInit(&argc, argv); 
             glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA); 
             glutInitWindowPosition(100,100); 
             glutInitWindowSize(320,320); 
             glutCreateWindow("3D Tech- GLUT Tutorial"); 
             glutDisplayFunc(renderScene); 
             glutMainLoop(); 
    }
    

      





    当我们编译发生以下错误时:

    错误 1 error LNK2019: 无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 
    错误 2 error LNK2019: 无法解析的外部符号 __imp____glutCreateWindowWithExit@8,该符号在函数 _glutCreateWindow_ATEXIT_HACK@4 中被引用 
    错误 3 error LNK1120: 2 个无法解析的外部命令

    网络上最有效的解决方式:

    刚好在#include<gl/glut.h>之前加上

    #define GLUT_DISABLE_ATEXIT_HACK



    如果我们选用的是C++的Win32项目,其中选程序类型选择

    无法解析的外部符号 __imp____glutCreateMenuWithExit@8:

    Win32 项目中应用程序的入口函数为 WinMain (窗口应用程序的主函数).而 Win32控制台应用程序的入口函数为 main 函数,也就是普通的命令行应用程序的主函数。
    所以在 Win32项目中, 没有写 WinMain 函数实现就会出现链接错误了。同样在 Win32 控制台应用程序中, 没有写 main 函数的实现也会出现连接错误一样。

    我们需要写函数:

    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow)

    这个作为应用程序的入口函数(相当于控制台程序的main函数)


    错误 1 error LNK1168: 无法打开 C:UsersyejinruDesktop计算机图形学Debug计算机图形学.exe 进行写入 C:UsersyejinruDesktop计算机图形学计算机图形学LINK 计算机图形学

    遇到这种情况时,需要在任务管理器中手动把运行着的exe结束任务或者把项目暂停运行。

    借别人的代码一用。。。原地址在:http://www.cppblog.com/wicbnu/archive/2010/09/30/128123.aspx

    //#pragma comment(lib, "OpenGL32.lib")
    //#pragma comment(lib, "GLU32.lib")
    //#pragma comment(linker, "/subsystem:console")
    
    #include "stdafx.h"
    #include <windows.h>
    #include <GL/glu.h>
    #include <GL/gl.h>
    #include <GL/glaux.h>
    
    #define GLUT_DISABLE_ATEXIT_HACK
    #include <GL/glut.h>
    
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    
    void background(void){
    
    //设置背景颜色为黑色
        glClearColor(0.0,0.0,0.0,0.0);
    
    }
    
    
    void myDisplay(void){
    
    //buffer设置为颜色可写
    
        glClear(GL_COLOR_BUFFER_BIT);
    
    //开始画三角形
    
        glBegin(GL_TRIANGLES);
    
    //设置为光滑明暗模式
    
        glShadeModel(GL_SMOOTH);
    
    //设置第一个顶点为红色
    
        glColor3f(1.0,0.0,0.0);
    
    //设置第一个顶点的坐标为(-1.0,-1.0)
    
        glVertex2f(-1.0,-1.0);
    
    //设置第二个顶点为绿色
    
        glColor3f(0.0,1.0,0.0);
    
    //设置第二个顶点的坐标为(0.0,-1.0)
    
        glVertex2f(0.0,-1.0);
    
    //设置第三个顶点为蓝色
    
        glColor3f(0.0,0.0,1.0);
    
    //设置第三个顶点的坐标为(-0.5,1.0)
    
        glVertex2f(-0.5,1.0);
    
    //三角形结束
    
        glEnd();
    
    //强制OpenGL函数在有限时间内运行
    
        glFlush();
    
    }
    
    void myReshape(GLsizei w,GLsizei h){
    
        glViewport(0,0,w,h);
    
    //设置视口
    
    
    
        glMatrixMode(GL_PROJECTION);
    
    //指明当前矩阵为GL_PROJECTION
    
        glLoadIdentity();
    
    //将当前矩阵置换为单位阵
    
    
    
        if(w <= h)
    
            gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);
    
    //定义二维正视投影矩阵
    
        else
    
            gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
    
        glMatrixMode(GL_MODELVIEW);
    
    //指明当前矩阵为GL_MODELVIEW
    
    }
    
    
    int main(int argc, char* argv[]){
    
    // 初始化
    
        glutInit(&argc,argv);
    
        glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    
        glutInitWindowSize(400,400);
    
        glutInitWindowPosition(200,200);
    
    
    //创建窗口
    
        glutCreateWindow("Triangle");
    
    
    //绘制与显示
    
        background();
    
        glutReshapeFunc(myReshape);
    
        glutDisplayFunc(myDisplay);
    
        glutMainLoop();
    
        return(0);
    
    }
    
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow){
    	char* argv[20] = {"a.bmp"};
    
    	main(1,argv);
    	return 0;
    }
    

      

  • 相关阅读:
    java反射详解
    Oracle创建视图权限不足(解决)
    SQL Server为啥使用了这么多内存?
    在cmd中运行android.bat报出空指针异常
    QTP生成随机数字+字母
    loadView和ViewDidLoad区别
    Bonjour(苹果电脑公司的服务器搜索协议商标名)
    |= 或赋值
    我见过的类
    UML 继承和接口实现
  • 原文地址:https://www.cnblogs.com/yejinru/p/3588454.html
Copyright © 2011-2022 走看看