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。

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

最后结果

以上。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,401评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,011评论 3 413
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,263评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,543评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,323评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,874评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,968评论 3 439
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,095评论 0 286
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,605评论 1 331
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,551评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,720评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,242评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,961评论 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,358评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,612评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,330评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,690评论 2 370

推荐阅读更多精彩内容