OpenGL学习笔记——上色

前言

初学OpenGL,我越来越觉得学习OpenGL的过程,像一个小朋友学画画(我就是那个小朋友!)一开始,只画找来一张纸(窗体),在上面随便的涂抹上色,然后学着画规则物体,三角形、圆形等,接着学习画一些具有透视的3D场景,最后越画越接近真实的物理效果。

正所谓万事开头难,上一篇写了如何配置OpenGL的环境,相当于学会了如何展开一张画,这次要开始记录如何握笔。

参考教程

正文

<b>需求:</b>创建一个指定大小的窗体,并涂满指定的颜色。按ESC键退出窗体。

#include "stdafx.h"  
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>

// GLFW
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;

// GL窗体的按钮回调
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);

// Window dimensions
const GLuint WIDTH = 800, HEIGHT = 600;

第一部分比较简单,包含了必须的库,然后声明了按键回调,为了实现ESC退出窗体,同时定义了窗体的宽高。

int main(void)
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    ...

从这段代码,我们可以看出,glfw主要是为我们提供窗口的库,我们调用glfwInit();初始化,然后通过

GLFWAPI void glfwWindowHint(int hint, int value);

配置glfw窗口的相关属性。与通常的配置一样,glfwWindowHint方法的第一个参数是配置项,第二个参数是配置项的值。 上面这段代码的前两句,分别配置了glfwWindow的主版本号和副版本号,因此,我们告诉glfw,我们使用的OpenGL是3.3版本的。 第三句表示,我们只使用当前版本未被废弃的特性。 第四句表示,我们的窗体不允许被手动缩放(初学为了简化难度,忽略缩放问题)。

    ...
    // Create a GLFWwindow object that we can use for GLFW's functions
    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);

    if (window == nullptr)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    // Make the context of the specified window current on the calling thread
    glfwMakeContextCurrent(window);
    glfwSetKeyCallback(window, key_callback);
    ...

上面的代码中,我们调用

GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share);

创建了我们的GLFW窗体。 这个方法中,前两个参数是窗体的宽高; 第三个参数是窗体的名字; 第四个参数是显示器相关参数,我们暂时不需要,当我们要创建全屏窗体时可能会用到。 第五个参数可以传入一个已经创建的窗体,并分享它的一些属性给当前要创建的窗体,我们暂时也不需要。

完成窗体的创建之后,我们先对创建过程进行一次检查。如果创建失败就直接终止程序。 如果创建成功,我们继续往下,调用

GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window);

使我们创建的窗体的上下文到调用的线程上。

glfwSetKeyCallback(window, key_callback);

调用GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun);使窗口监听键盘按键。第一个参数是窗体对象,第二个参数是我们声明的按键回调函数。

至此,一个基本的窗体就创建完成,接下来就是在上面布满颜色。

while (!glfwWindowShouldClose(window))
    {
        // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions
        glfwPollEvents();

        // Clear the colorbuffer
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // Swap the screen buffers
        glfwSwapBuffers(window);
    }

判断glfw窗口是否应该关闭。然后进行循环。 glfwPollEvents()监听所有事件,包括键盘点击和鼠标移动。 GLAPI void GLAPIENTRY glClearColor (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);清除屏幕,同时可以设置清除屏幕的颜色的ARGB值。 GLAPI void GLAPIENTRY glClear (GLbitfield mask);清除gl的数据,可以通过输入的标志位决定清除数据的类型,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲。 GLFWAPI void glfwSwapBuffers(GLFWwindow* window);交换缓存区,执行刷新操作。 由于,我们采用双缓冲的结构,交换缓存时,我们就可以刷新窗口。

    glfwTerminate();

结束循环后,终止OpenGL。

最终,我们就可以打开一个窗体,并涂上固定的颜色。

最后结果

以上。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏liulun

ASP.NET Core教程【三】实体字段属性、链接标签、并发数据异常、文件上传及读取

前文索引: ASP.NET Core教程【二】从保存数据看Razor Page的特有属性与服务端验证 ASP.NET Core教程【一】关于Razor Page...

2376
来自专栏大内老A

扩展UltraGrid控件实现对所有数据行的全选功能[Source Code下载]

在前面一篇文章中,我通过对三种Infragistics 控件(UltraToolBarManager、UltraGird和UltraListView)进行扩展,...

24110
来自专栏葡萄城控件技术团队

Wijmo 更优美的jQuery UI部件集:导出Wijmo的GridView到Excel

Wijmo GridView 控件不提供导出Excel文件的方法。本篇博客介绍一种将Wijmo的GridView控件保存到Excel的简单方法。你可以使用同样的...

2348
来自专栏JackieZheng

可视化(番外篇)——SWT总结

  本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物、有何用,SWT中...

18810
来自专栏xx_Cc的学习总结专栏

六天完成一个简单iOS App - 第五天

2776
来自专栏我的博客

Dedecms普通模型入门教程

1. 默认模板设置 里面是default后面变量名字是cfg_df_style(在模版中使用方法是{dede:golbal.cfg_df_style/}获取的路...

3536
来自专栏计算机编程

ionic4 -- angular 跳转页面

ionic4 与前辈们最大的不同就是通过angular引入了route,这样每次跳转的时候只需要直接跳转对应的路由地址就可以了,给了路由器上的解耦,也解决了原来...

1682
来自专栏青玉伏案

iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件

本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由...

2048
来自专栏向治洪

android dataBinding详解

官方介绍地址:http://developer.android.com/intl/zh-cn/tools/data-binding/guide.html 201...

19110
来自专栏iKcamp

微信小程序基于最新版1.0开发者工具分享-小试牛刀(视频)+发布流程

第一章:小程序初级入门教程 小试牛刀【含视频】 视频地址:https://v.qq.com/x/page/i0554akzobq.html 这一章节中,我们尝...

2029

扫码关注云+社区