OpenGL超级宝典笔记----框架搭建

  自从工做后,老是或多或少的会接触到客户端3d图形渲染,正好本身对于3d图形的渲染也很感兴趣,因此最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术。到网上查了一些资料,OpenGL的入门学习一般是用《OpenGL开发指南》和《OpenGL超级宝典》这两本书。博主最近在看《OpenGL超级宝典》,在这里分享一些本身的理解,但愿和园子里的人一块儿学习和探讨。html

 一、 建立工程git

《OpenGL超级宝典》的做者为了不每一个例子都重复写一些窗口建立,捕获消息,专门写了一个应用程序的框架。程序框架的代码在github上,先把里面的sb7code代码下载下来,而后解压缩,能够看到有下面这些文件:github

  从上面的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宏建立这个程序就能够了。建立程序的大体代码以下:app

#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, 0, white);
     }
};

DECLARE_MAIN(test_app)

而后编译就能够直接运行了,这样咱们就能够彻底不用关心窗口的建立,只须要关心怎样用opengl进行渲染就好了。框架

二、application函数

   如今来看下类application和宏DECLARE_MAIN怎样为咱们建立应用程序的。application类中有个run方法,主要的代码以下:post

 1  virtual void run(sb7::application* the_app)
 2     {
 3         bool running = true;
 4         app = the_app;
 5 
 6         glfwInit()
 7         init();
 8         glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, info.majorVersion);
 9         glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, info.minorVersion);
10         glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
11         glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
12         glfwWindowHint(GLFW_SAMPLES, info.samples);
13         glfwWindowHint(GLFW_STEREO, info.flags.stereo ? GL_TRUE : GL_FALSE);
14 
15         window = glfwCreateWindow(info.windowWidth, info.windowHeight, info.title, NULL, NULL);
16         glfwMakeContextCurrent(window);
17         glfwSetWindowSizeCallback(window, glfw_onResize);
18         glfwSetKeyCallback(window, glfw_onKey);
19         glfwSetMouseButtonCallback(window, glfw_onMouseButton);
20         glfwSetCursorPosCallback(window, glfw_onMouseMove);
21         glfwSetScrollCallback(window, glfw_onMouseWheel);
22         gl3wInit();
23         startup();
24 
25         do
26         {
27             render(glfwGetTime());
28             glfwSwapBuffers(window);
29             glfwPollEvents();
30             running &= (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_RELEASE);
31             running &= (glfwWindowShouldClose(window) != GL_TRUE);
32         } while (running);
33 
34         shutdown();
35         glfwDestroyWindow(window);
36         glfwTerminate();
37     }

  run方法先调用glfwInit来初始化glfw,而后调用glfwCreateWindow来建立窗口,随后调用glfwSetXXXCallback来设置消息处理的回调函数,最后经过while循环来执行render函数,获取消息等。run中还有init和setup函数,这些函数只有是用来给子类设置一些本身的参数。学习

  DECLARE_MAIN宏的定义以下:ui

 1 #define DECLARE_MAIN(a)                             \
 2 sb7::application *app = 0;                          \
 3 int CALLBACK WinMain(HINSTANCE hInstance,           \
 4                      HINSTANCE hPrevInstance,       \
 5                      LPSTR lpCmdLine,               \
 6                      int nCmdShow)                  \
 7 {                                                   \
 8     a *app = new a;                                 \
 9     app->run(app);                                  \
10     delete app;                                     \
11     return 0;                                       \
12 }

  这个宏定义了WinMain函数,它是win32窗口程序的入口,至关于控制台程序的main函数。而后在这个函数里面new了咱们本身定义的application子类对象,最后调用对象的run方法来建立窗口和调用render函数。url

  有了这个框架,基本上咱们只须要继承下application类,重写下render函数就能够跑咱们的opengl程序了,很是的方便。

相关文章
相关标签/搜索