今天从零开始,连续写关于在Windows下用VS2015开发学习OpenGL的过程,实战记录!!
手把手实战指导,每一步都是图文并茂详解,不怕你学不会,就怕你不想动!
第一步:首先你要下载并安装VS2015版本。
今后的相关连载文章或源码,都会以这个版本展开。
VS2015的具体下载和安装,这里就不讲了,网上搜一下应该很多。
第二步:准备好OpenGL的相关库,主要有两个GLFW和GLAD。
GLFW:是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的。
GLAD:由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
A:如何获得GLFW ?你可以从这个地址进行下载
(点击打开) http://www.glfw.org/download.html
GLFW的官网提供了Source包和编译好的Binaries文件,我们选择下载(32-bit Windows binaries)。
为什么选择32-bit位的而不是64-bit位的呢?这里它一定要和你的VS2015的工程x86对应上。x86表示32位。
第三步:创建一个C++的工程,用来准备我们的测试。
打开安装好的VS2015,我们来创建一个名称叫”TestOpenGL“的C++“空项目”。
然后在项目名称上右键菜单,打开项目所在的目录。
然后,在项目目录下创建两个文件夹,分别是。Includes 和 Libs。像下图这样。
把在第二步下载好的GLFW的压缩包(glfw-3.2.1.bin.WIN32.zip)打开。
(a)把压缩包中的 ../include/GLFW/ 中的 glfw3.h 复制到上面在项目中创建好的 Inlcudes 文件夹中。
(b)把压缩包中的 ../lib-vc2015/ 中的 glfw3.lib 复制到上面在项目中创建好的 Libs 文件夹中。
回到VS2015软件界面中,在工程TestOpenGL名称上右键,选择《属性》。在弹出的“属性”界面中,选择C++目录。
在“包含目录”中添加 Inlcudes 文件夹目录。在“库目录”中添加 Libs 文件夹。如下图所示:
然后继续,左边点击链接器,输入,附加依赖项里输入:opengl32.lib glfw3.lib 。
点击确定,到这里GLFW的环境已经布署完毕。接下来开始布署第二步提到的GLAD。
第三步:准备和布署GLAD。
A:如何获取GLAD ? 我们可以在它的一个在线服务网站来获得。(点击打开)http://glad.dav1d.de/
如上图所示,在API选择Version3.3,在Profile选项 Core。
然后下面的Options保证Generate a loader是勾上的。
点击 GENERATE 来创建和生成所要的包。
点击glad.zip下载到电脑。打开压缩包所下图所示。
(a)打开压缩包,把include中所有的文件复制到我们的Includes中
(b)把src中的文件 glad.c 复制到项目目录下,如下图所示:
然后,回到VS2015软件界面中。在源文件上右键,添加现有项,把glad.c添加进去。
到这里,GLFW和GLAD就全部搞完了。
最后一步,就是见证奇迹的时刻了!!!!
创建一个 mian.cpp 输入以下测试内容,先不用管这些代码有什么用。看不懂没关系后边会讲解。
现在主要是为了测试并启动openGL渲染窗口,来验证开发环境是否正确无误。
#include "Includes\glad\glad.h"
#include "Includes\glfw3.h"
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
// settings
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main()
{
// glfw: initialize and configure
// ------------------------------
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // uncomment this statement to fix compilation on OS X
#endif
// glfw window creation
// --------------------
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// glad: load all OpenGL function pointers
// ---------------------------------------
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// render loop
// -----------
while (!glfwWindowShouldClose(window))
{
// input
// -----
processInput(window);
// render
// ------
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
// -------------------------------------------------------------------------------
glfwSwapBuffers(window);
glfwPollEvents();
}
// glfw: terminate, clearing all previously allocated GLFW resources.
// ------------------------------------------------------------------
glfwTerminate();
return 0;
}
// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
// make sure the viewport matches the new window dimensions; note that width and
// height will be significantly larger than specified on retina displays.
glViewport(0, 0, width, height);
}
调试运行,如果不出现意外,你的窗口应该如图所示,大功告成!!!
搞到这里,想想还是有些小激动,虽然是个小小开始,这就是迈向成功的一大步!
大门已经开启,接下来,是时候开始表演真正的技术了!!
从零开始真正进入OpengGL的3D世界!!
---------------------
原文:https://blog.csdn.net/sjt223857130/article/details/80037749