OpenGL超级宝典笔记----框架搭建
自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术。到网上查了一些资料,OpenGL的入门学习通常是用《OpenGL开发指南》和《OpenGL超级宝典》这两本书。博主最近在看《OpenGL超级宝典》,在这里分享一些自己的理解,希望和园子里的人一起学习和探讨。
1、 创建工程
《OpenGL超级宝典》的作者为了避免每个例子都重复写一些窗口创建,捕获消息,专门写了一个应用程序的框架。程序框架的代码在github上,先把里面的sb7code代码下载下来,然后解压缩,可以看到有下面这些文件:
从上面的CMakeLists.txt可以发现,这个工程是用cmake来生成的。所以需要下载cmake,至于怎样使用cmake,可以参考使用cmake自动构建工程。除了cmake外,工程中使用了glfw库来创建窗口和捕获键盘和鼠标的消息。为了使用glfw,需要先把它编译成库文件,glfw的源文件在extern目录中,它的工程也是通过cmake来建立的,所以如果会使用cmake的话就可以先通过cmake建立一个vs工程,然后编译工程就可以生成对应的库文件了。把在debug模式下生成的glfw3.lib(重命名为glfw3_d.lib)和release模式下生成的库文件glfw3.lib拷贝到lib目录中。最后运行cmake生成vs工程,生成的工程可以在build中找到,打开build下面的superbible7.sln工程文件,就可以发现很多书本上介绍的例子项目了。其中sb7就是整个工程的框架,在sb7里面实现了类application,新的程序只需要继承这个类,然后根据需要重写里面的一些方法,最后用DECLARE_MAIN宏创建这个程序就可以了。创建程序的大致代码如下:
#include <sb7.h> class simpleclear_app : public sb7::application
{
//重载一些方法
virtual void render(double currentTime)
{
static const GLfloat white[] = { 1.0f, 0.0f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, , white);
}
}; DECLARE_MAIN(test_app)
然后编译就可以直接运行了,这样我们就可以完全不用关心窗口的创建,只需要关心怎样用opengl进行渲染就行了。
2、application
现在来看下类application和宏DECLARE_MAIN怎样为我们创建应用程序的。application类中有个run方法,主要的代码如下:
virtual void run(sb7::application* the_app)
{
bool running = true;
app = the_app; glfwInit()
init();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, info.majorVersion);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, info.minorVersion);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_SAMPLES, info.samples);
glfwWindowHint(GLFW_STEREO, info.flags.stereo ? GL_TRUE : GL_FALSE); window = glfwCreateWindow(info.windowWidth, info.windowHeight, info.title, NULL, NULL);
glfwMakeContextCurrent(window);
glfwSetWindowSizeCallback(window, glfw_onResize);
glfwSetKeyCallback(window, glfw_onKey);
glfwSetMouseButtonCallback(window, glfw_onMouseButton);
glfwSetCursorPosCallback(window, glfw_onMouseMove);
glfwSetScrollCallback(window, glfw_onMouseWheel);
gl3wInit();
startup(); do
{
render(glfwGetTime());
glfwSwapBuffers(window);
glfwPollEvents();
running &= (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_RELEASE);
running &= (glfwWindowShouldClose(window) != GL_TRUE);
} while (running); shutdown();
glfwDestroyWindow(window);
glfwTerminate();
}
run方法先调用glfwInit来初始化glfw,然后调用glfwCreateWindow来创建窗口,随后调用glfwSetXXXCallback来设置消息处理的回调函数,最后通过while循环来执行render函数,获取消息等。run中还有init和setup函数,这些函数只有是用来给子类设置一些自己的参数。
DECLARE_MAIN宏的定义如下:
#define DECLARE_MAIN(a) \
sb7::application *app = ; \
int CALLBACK WinMain(HINSTANCE hInstance, \
HINSTANCE hPrevInstance, \
LPSTR lpCmdLine, \
int nCmdShow) \
{ \
a *app = new a; \
app->run(app); \
delete app; \
return ; \
}
这个宏定义了WinMain函数,它是win32窗口程序的入口,相当于控制台程序的main函数。然后在这个函数里面new了我们自己定义的application子类对象,最后调用对象的run方法来创建窗口和调用render函数。
有了这个框架,基本上我们只需要继承下application类,重写下render函数就可以跑我们的opengl程序了,非常的方便。
OpenGL超级宝典笔记----框架搭建的更多相关文章
- OpenGL超级宝典笔记----渲染管线
在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...
- 【转】OpenGL超级宝典笔记——纹理映射Mipmap
原文地址 http://my.oschina.net/sweetdark/blog/177812 , 感谢作者,若非法转载请联系本人. 目录[-] Mipmapping Mipmap过滤 构建Mip层 ...
- 【转载】OpenGL超级宝典笔记——GLSL语言基础
变量 GLSL的变量命名方式与C语言类似.变量的名称可以使用字母,数字以及下划线,但变量名不能以数字开头,还有变量名不能以gl_作为前缀,这个是GLSL保留的前缀,用于GLSL的内部变量.当然还有一些 ...
- OpenGL超级宝典笔记——画三角形(转)
http://my.oschina.net/sweetdark/blog/161002 学习了画线的知识,我们可以使用GL_LINE_LOOP来画闭合的多边形.但是使用这种方式画出来的只有线框,多边形 ...
- OpenGL超级宝典笔记——贝塞尔曲线和曲面(转)
http://my.oschina.net/sweetdark/blog/183721 参数方程表现形式 在中学的时候,我们都学习过直线的参数方程:y = kx + b;其中k表示斜率,b表示截距(即 ...
- OpenGL超级宝典笔记——遮挡查询 [转]
目录[-] 遮挡查询之前 包围体 遮挡查询 在一个场景中,如果有有些物体被其他物体遮住了不可见.那么我们就不需要绘制它.在复杂的场景中,这可以减少大量的顶点和像素的处理,大幅度的提高帧率.遮挡查询就是 ...
- OpenGL超级宝典笔记——深度纹理和阴影 【转】
目录[-] 光源视角 新型的纹理 深度纹理的大小 首先绘制阴影 然后是光照 投影阴影贴图 阴影比较 之前我们介绍过简单的把物体压平到投影平面来制造阴影.但这种阴影方式有其局限性(如投影平面须是平面). ...
- win8+VS2012搭建OpenGL超级宝典的环境
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/booirror/article/details/36957799 自从公司搬到腾讯附近,每天上班都迟 ...
- 《OpenGL超级宝典》编程环境配置
最近在接触OpenGL,使用的书籍就是那本<OpenGL超级宝典>,不过编程环境的搭建和设置还是比较麻烦的,在网上找了很多资料,找不到GLTools.lib这个库.没办法自己就借助源码自己 ...
随机推荐
- NodeJs在Linux下使用的各种问题
环境:ubuntu16.04 ubuntu中安装NodeJs 通过apt-get命令安装后发现只能使用nodejs,而没有node命令 如果想避免这种情况请看下面连接的这种安装方式: 拓展见:Linu ...
- .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布
众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...
- 移动web基本知识
1.pixel像素基础 1.px:csspixel 逻辑像素,浏览器所使用的抽象单位 2.dp,pt:设备无关像素 3.devicePixelPatio 设备像素缩放比例 2.viewport 1. ...
- 苹果强制使用HTTPS传输了怎么办?——关于HTTPS,APP开发者必须知道的事
WeTest 导读 2017年1月1日起,苹果公司将强制使用HTTPS协议传输.本文通过对HTTPS基础原理和通信过程内容的讲解,介绍APP开发者在这个背景下的应对办法. 几周前,我们在<htt ...
- 谈谈一些有趣的CSS题目(五)-- 单行居中,两行居左,超过两行省略
开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...
- 使用Microsoft的IoC框架:Unity来对.NET应用进行解耦
1.IoC/DI简介 IoC 即 Inversion of Control,DI 即 Dependency Injection,前一个中文含义为控制反转,后一个译为依赖注入,可以理解成一种编程模式,详 ...
- sql server 取文件名函数 转载
/****** Object: UserDefinedFunction [dbo].[GetDirectoryPath] Script Date: 2016-12-16 16:54:05 ****** ...
- [AlwaysOn Availability Groups]健康模型 Part 1——概述
健康模型概述 在成功部署AG之后,跟踪和维护健康状况是很重要的. 1.AG健康模型概述 AG的健康模型是基于策略管理(Policy Based Management PBM)的.如果不熟悉这个特性,可 ...
- ucos实时操作系统学习笔记——任务间通信(消息)
ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...
- 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。
目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...