初学OpenGL(1):准备工作

原创 2018年04月15日 11:40:28

    因为实验室要做一个三维眼球重建的项目,老板让我先熟悉一下OpenGL的编程,以下内容参考了LearnOpenGL CN,github地址戳我

    一、环境配置

    GLFW+GLAD+VS2017,具体流程参考上面的教程。

    GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。

    因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。幸运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。

    配置项目属性:新建项目--解决方案 右键属性--VC++目录 包含目录、库目录分别把include 和 libc文件夹添加进去

链接器--输入--添加glfw3.lib、opengl32.lib。

    为了以后建立项目不用再进行配置,点击视图--其他窗口--属性管理器,直接设置父级属性。

    查看自己电脑上OpenGL的版本:安装OpenGL extensions viewer,查看版本号。考虑兼容性问题,按照教程中使用3.3版本。

    在使用时需要添加:

#include <glad\glad.h>  
#include <GLFW\glfw3.h>  
    需要注意,GLAD的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL的头文件之前包含GLAD。

    二、创建窗口

    实例化GLFW窗口:

// 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);

    设置版本号为3.3,并使用核心模式。

    接着创建窗口对象:

	 // 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);
    GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD:
	// glad: load all OpenGL function pointers  
	// ---------------------------------------  
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

    在我们开始渲染之前还有一件重要的事情要做,我们必须告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。我们可以通过调用glViewport函数来设置窗口的维度(Dimension)。glViewport函数前两个参数控制窗口左下角的位置。第三个和第四个参数控制渲染窗口的宽度和高度(像素)。

// 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);
}

    这里对窗口注册了一个回调函数(Callback Function),在每次窗口大小改变时被调用。

    我们还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数,在第一次显示时也会被调用:

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    为了在我们主动关闭前保持显示,需要不断绘制图像,为此我们需要添加一个渲染循环(Render Loop):
        // render loop  
	// -----------  
	while (!glfwWindowShouldClose(window))
	{
		// input  
		// -----  
		processInput(window);

		// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)  
		// -------------------------------------------------------------------------------  
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

    glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出,如果是的话该函数返回true然后渲染循环便结束了,之后为我们就可以关闭应用程序了。

    ProcessInput检查用户是否按下ese键:

// 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);
}

    glfwSwapBuffers函数会交换颜色缓冲(它是一个储存着GLFW窗口每一个像素颜色值的大缓冲),它在这一迭代中被用来绘制,并且将会作为输出显示在屏幕上。

    glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态,并调用对应的回调函数(可以通过回调方法手动设置)。




OpenGL编译环境

1.下载glfw源码,解压,CMake,使用vs2013编译得glfw3.lib库。如下所示: 2.将编译好的glfw3.lib以及它的include目录,拷贝出来,单独创建一个3rd目录存放。以...
  • huhaoxuan2010
  • huhaoxuan2010
  • 2017-08-30 09:31:22
  • 1225

VS2017+OpenGL环境的配置

旧版本 固定管线 也是资料最多的OpenGL】我的工具是VS20171.方法(下载各种库文件)下载OpenGL的所需要的文件http://www.opengl.org/resources/librar...
  • CJB_King
  • CJB_King
  • 2018-03-16 13:42:58
  • 48

搭建opengl GLFW GLAD环境

win7+VS2013环境下面GLFW  下面是弄好的包的下载 http://download.csdn.net/download/qq_35158695/10156577 你建一个空项目然...
  • qq_35158695
  • qq_35158695
  • 2017-12-13 13:20:52
  • 154

配置GLEW+GLFW并使用Xcode写OpenGL应用

在Xcode中配置GLEW+GLFW环境 2016年10月28日 CONTENTS 闲话正题 闲话 因为这几天一直在忙着图形学的实验,发现真的是很蛋疼,因为课程还在使...
  • LongZh_CN
  • LongZh_CN
  • 2017-02-12 14:41:52
  • 3749

vs-OpenGL编程入门学习

最近需要用c语言绘图,我用的编译软件是vs2013,有人给我推荐使用opengl库,从网上看到一篇比较详细的入门教程,感觉不错,给大家分享一下 本文转自:http://www.cppblog.com...
  • wsls777
  • wsls777
  • 2017-12-04 10:28:31
  • 577

OpenGL 入门资料(适合初学者)

1. 中文 LearnOpenGL-CN :http://learnopengl-cn.readthedocs.io/zh/latest/ 2. 英文 LearnOpenGL : http://lea...
  • aa20274270
  • aa20274270
  • 2016-08-05 17:53:07
  • 3361

openGL学习心得(1)

实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,...
  • reecefan
  • reecefan
  • 2016-09-23 15:48:55
  • 427

OpenGL学习笔记:版本和扩展

可以通过以下方法获取自己系统中的OpenGL版本: const char* version = (const char*)glGetString(GL_VERSION);  printf("OpenG...
  • lcphoenix
  • lcphoenix
  • 2011-06-29 12:55:00
  • 2561

在VS中(单文档)配置和使用OpenGL

OpenGL(碎梦花事) (参考《实战OpenGL三维可视化系统开发与源码精解》,吕希奎,周小平著) 一、OpenGL像素格式 1、像素格式设置       像素格式是OpenGL窗口的重要属...
  • suimenghuashi
  • suimenghuashi
  • 2013-01-26 21:02:31
  • 699

一个初学OPENGL很好的例子

  • 2009年08月31日 17:00
  • 82KB
  • 下载
收藏助手
不良信息举报
您举报文章:初学OpenGL(1):准备工作
举报原因:
原因补充:

(最多只允许输入30个字)