VS2015运行OpenGL编程指南第8版的第一个示例

来源:互联网 发布:小米平板2怎么连接网络 编辑:程序博客网 时间:2024/05/19 02:43

VS2015运行OpenGL编程指南第8版的第一个示例

杂谈

  • 一直在入门OpenGL,难得找到一本不错的参考书,发现里面的示例在自己的VS2015中运行有问题。在网上找了很多博客,VS2015中跑OpenGL红宝书第八版的示例代码这篇写的比较不错。但是具体实现存在一点小问题。
  • 其中第三步是将“Platform Toolset”设置为VS2013,而我只装了VS2015,没有比他更低的平台工具。其实这一步可以换一种方式实现。
  • 错误主要是:无法解析的外部符号 _sscanf、 ___iob_func等。这个问题很好解决,主要是VS2015相对于之前的版本有所改动,具体可以自行百度。解决方法如下:
  • 1.右键项目–>属性–>链接器–>输入–>附加依赖项:legacy_stdio_definitions.lib
    这里写图片描述
  • 2.在源文件中添加以下代码
#if _MSC_VER>=1900#include "stdio.h"_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);#ifdef __cplusplusextern "C"#endifFILE* __cdecl __iob_func(unsigned i) {    return __acrt_iob_func(i);}#endif /* _MSC_VER>=1900 */
  • 上述方法可以代替他的第三步。本人由于不想用书上源代码中提供的库,自己从开源网站上下了最新版本的freeglut和flew。捣鼓了好久,终于调通了,记录一下这个过程。

一、下载freeglut和glew

freeglut-MSVC-3.0.0-2.mp.zip (访问密码 b137)
glew-2.0.0-win32.zip (访问密码 7112)

二、VS2015新建项目

  • 1 新建“win32控制台应用程序”
    这里写图片描述

  • 2.附加选项:空项目
    这里写图片描述

  • 3.新建triangles.cpp文件,添加书上的代码,可以直接拷贝以下内容。其中有一部分和源码不一致,下面代码中已经标出。

/////////////////////////////////////////////////////////////////////////// triangles.cpp/////////////////////////////////////////////////////////////////////////#include <iostream>using namespace std;/** 注意:*     不想使用源码中提供的库,所以注释了vgl.h头文件,这就需要增加下面三行代码*///#include "vgl.h"#include <GL/glew.h>#include <GL/freeglut.h>#define BUFFER_OFFSET(x)  ((const void*) (x))#include "LoadShaders.h"enum VAO_IDs { Triangles, NumVAOs };enum Buffer_IDs { ArrayBuffer, NumBuffers };enum Attrib_IDs { vPosition = 0 };GLuint VAOs[NumVAOs];GLuint Buffers[NumBuffers];const GLuint NumVertices = 6;//---------------------------------------------------------------------//// init//void init(void){    glGenVertexArrays(NumVAOs, VAOs);    glBindVertexArray(VAOs[Triangles]);    GLfloat vertices[NumVertices][2] = {        { -0.90, -0.90 }, // Triangle 1        { 0.85, -0.90 },        { -0.90, 0.85 },        { 0.90, -0.85 }, // Triangle 2        { 0.90, 0.90 },        { -0.85, 0.90 }    };    glGenBuffers(NumBuffers, Buffers);    glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices),        vertices, GL_STATIC_DRAW);    ShaderInfo shaders[] = {        { GL_VERTEX_SHADER, "triangles.vert" },        { GL_FRAGMENT_SHADER, "triangles.frag" },        { GL_NONE, NULL }    };    GLuint program = LoadShaders(shaders);    glUseProgram(program);    glVertexAttribPointer(vPosition, 2, GL_FLOAT,        GL_FALSE, 0, BUFFER_OFFSET(0));    glEnableVertexAttribArray(vPosition);}//---------------------------------------------------------------------//// display//void display(void){    glClear(GL_COLOR_BUFFER_BIT);    glBindVertexArray(VAOs[Triangles]);    glDrawArrays(GL_TRIANGLES, 0, NumVertices);    glFlush();}//---------------------------------------------------------------------//// main//int main(int argc, char** argv){    glutInit(&argc, argv);    glutInitDisplayMode(GLUT_RGBA);    glutInitWindowSize(512, 512);    glutInitContextVersion(4, 3);    glutInitContextProfile(GLUT_CORE_PROFILE);    glutCreateWindow(argv[0]);    if (glewInit()) {        cerr << "Unable to initialize GLEW ... exiting" << endl;        exit(EXIT_FAILURE);    }    init();    glutDisplayFunc(display);    glutMainLoop();}
  • 4.将源文件中的LoadShaders.cpp和LoadShaders.h文件一同拷到triangles.cpp所在的目录下,同时右键工程–>添加现有项,将他们添加到项目中。在LoadShaders.cpp中找到#define GLEW_STATIC,将其注释掉。
    这里写图片描述

三、添加freeglut和glew

  1. 在项目根目录下新建include和lib文件(个人习惯)。
    这里写图片描述

  2. 将下载的freeglut和glew文件中的include文件拷贝进来。
    这里写图片描述

  3. 同时右键工程–>属性–>C/C++–>常规–>附加包含目录,输入..\include
    这里写图片描述

  4. 根据你需要的编译目标,选择相应的lib文件。我这里编译的是32程序,所以将freeglut和glew文件中32位的freeglut.lib和glew32.lib拷贝到了lib目录下。
    这里写图片描述

  5. 右键工程–>属性–>链接器–>常规–>附加库目录,输入..\lib
    这里写图片描述

  6. 同时还需要在链接器–>输入–>附加依赖项中添加freeglut.lib、glew32.lib
    这里写图片描述

  7. 这时你运行程序会发现缺少dll文件,将freeglut和glew文件中的freeglut.dll和glew32.dll拷贝到可执行文件所在的Debug目录下。
    这里写图片描述

四、添加顶点着色器和片段着色器

在项目目录中新建两个文本分别命名为triangles.vert和triangles.frag
这里写图片描述

  • 1.triangles.vert
#version 430 corelayout(location = 0) in vec4 vPosition;voidmain(){    gl_Position = vPosition;}
  • 2.triangles.frag
#version 430 coreout vec4 fColor;voidmain(){    fColor = vec4(0.0, 0.0, 1.0, 1.0);}

五、运行结果

这里写图片描述

1 0
原创粉丝点击