OpenGL基础1:最简单的OpenGL例子

相对于一些基础的课程,例如一门计算机语言,又或者说是Unity3D之类的游戏引擎,openGL的学习是要难不少,因此在网上“查攻略”的时候尽量想办法 1. 多参考几篇文章;2. 有能力的话去google,去国外的学习网站看看;3. 所有代码自己再写一遍

本文(包括后续的openGL基础类文章)都是总结性质,难免会有少许不准确的地方,如有发现希望大家能够指出,万分感谢

一、事前准备

装环境看前一篇博客:https://blog.csdn.net/Jaihk662/article/details/105496707

教程参考于 http://ogldev.atspace.co.uk/index.html

可以将 http://ogldev.atspace.co.uk/ogldev-source.zip 里面需要的头文件(例如数字库)载下放入对应的文件夹中,后续出现“找不到头文件”之类的错误,可以按照名字从这个包里面找,还是记得注意路径

二、参考代码

#pragma comment(lib,"glew32.lib")
#include <stdio.h>
#include <opengl/glew.h>
#include <opengl/freeglut.h>
#include <opengl/ogldev_math_3d.h>

GLuint VBO;

//渲染回调函数
static void RenderScenceCB()
{
    // 清空颜色缓存
    glClear(GL_COLOR_BUFFER_BIT);

    // 开启顶点属性
    glEnableVertexAttribArray(0);
    // 绑定GL_ARRAY_BUFFER缓冲器
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // 告诉管线怎样解析bufer中的数据
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    // 开始绘制几何图形(绘制一个点)
    glDrawArrays(GL_POINTS, 0, 1);

    //  禁用顶点数据
    glDisableVertexAttribArray(0);

    // 交换前后缓存
    glutSwapBuffers();
}

//创建顶点缓冲器
static void CreateVertexBuffer()
{
    // 创建含有一个顶点的顶点数组
    Vector3f Vertices[1];
    // 将点置于屏幕中央
    Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f);

    // 创建缓冲器
    glGenBuffers(1, &VBO);
    // 绑定GL_ARRAY_BUFFER缓冲器
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    // 绑定顶点数据
    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}

/**
 * 主函数
 */
int main(int argc, char** argv)
{
    //初始化GLUT
    glutInit(&argc, argv);

    //显示模式:双缓冲、RGBA
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

    //窗口设置
    glutInitWindowSize(1136, 640);     //窗口尺寸
    glutInitWindowPosition(100, 100);  //窗口位置
    glutCreateWindow("20200414-02");   //窗口标题

    //开始渲染
    glutDisplayFunc(RenderScenceCB);

    //检查GLEW是否就绪,必须要在GLUT初始化之后!
    GLenum res = glewInit();
    if (res != GLEW_OK)
    {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
        return 1;
    }

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    CreateVertexBuffer();

    //通知开始GLUT的内部循环
    glutMainLoop();
    return 0;
}

效果如下:

一个白色的像素点在屏幕的最中央,打开后挪动下窗口看下输出,有惊喜!

三、注释

基础操作:

  • GLuint VBO:全局的GL变量(unsigned int),用于操作顶点的缓冲器对象,顶点是一切的基础,就像我么一般说屏幕的分辨率是 1920 * 1080,其实就是 1920 * 1080 个像素点,每个像素点都有着特定的颜色,最后拼出了我们屏幕的内容,假设你想在屏幕中展示一个正方体,又或者说是一个线段,那么第一步肯定是确定顶点的位置
  • glutInit(&argc, argv):glut初始化
  • glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA):设置显示模式为双缓冲、RGBA。单缓冲是直接在窗口上绘图,而双缓冲的绘图是在缓冲区完成的,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。
  • glutDisplayFunc(RenderScenceCB):注册一个绘图函数,在程序运行时是自动调用的,并且会被多次调用,RenderScenceCB 为回调函数,里面往往是“绘图步骤”
  • glClearColor(R, G, B, A):用预设的颜色来刷新缓冲区,配合 glClear(GL_COLOR_BUFFER_BIT)  使用,前者设置好颜色,后者进行清除操作
  • glutMainLoop():通知 glut 让所有与“事件”有关的函数调用无限循环,对于上面的代码,就会激活 RenderScenceCB 方法
  • glutSwapBuffers():还记得上面所说的双缓冲吗,也就是一个展示图像,另一个就在后台进行绘制,现在该换班了!后台的缓存进入屏幕展示给我们

缓冲区:

  • glGenBuffers(1, &VBO):第一个参数是要生成的缓冲对象的数量,第二个是要输入用来存储缓冲对象名称的数组,该函数会返回 n 个当前未使用的缓存对象名称,并保存到 buffers 数组中
  • glBindBuffer(GL_ARRAY_BUFFER, VBO):第一个参数是 target(类型),第二个参数是要绑定的缓存对象的名称,如果绑定到一个已经创建的缓存对象,那么它将成为当前 target 中被激活的缓存对象(同一个 target 同一时间只能绑定一个缓存对象),如果绑定的 buffer 值为 0,那么 OpenGL 将不再对当前 target 使用任何缓存对象,GL_ARRAY_BUFFER 是其中一个合法的 target,表示一个顶点的数组
  • glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW):绑定了我们的对象之后,我们就可以往里面添加数据了。其中第二、三个参数为内存容量和用于初始化缓冲区对象的数据,第四个参用于操作数据在分配之后如何进行读写, GL_STATIC_DRAW 表示数据只指定1次,但是可以多次作为绘图和图像指定函数的源数据

开始绘制:

  • glEnableVertexAttribArray(0):唯一的参数表示指定的通用顶点属性数组,先不考虑/使用着色器,我们加载到buffer中的顶点位置在固定功能管线中是被认为是索引为0的顶点属性(当没有着色器绑定时被启用),必须开启每一个顶点的属性,否则渲染管线无法获取这些数据
  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0):这个回调告诉管线怎样解析缓冲区中的数据,第一个参数为属性的索引,和上面一样,不考虑着色器的情况下默认为 0;第二个参数表示属性中元素的个数,像我们定义的点有 x, y, z 三个属性,那么这里就是 3,第三个参数指数据的类型,第四个参数定义是否希望数据被归一化,只表示方向不表示大小,后面两个参数暂时先不管,后面会有讲到(现在讲了八成你也一脸懵逼),总之在我们只有一个位置数据的情况下,都默认0就ok
  • glDrawArrays(GL_POINTS, 0, 1):现在我们终于可以开始绘制了,第一个参数表示每个顶点表示一个点,也就是告诉系统“我要画点(而不是画线或其它)”,第二个参数表示第一个要绘制的点的索引,第三个参数表示绘制多少个。在这个例子中我们是从最开始的缓冲开始绘制,所以第二个参数设置为 0
  • glDisableVertexAttribArray(0):当顶点短时间内不会被使用的时候,禁用它
原创文章 1134 获赞 1439 访问量 61万+

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/105515427
今日推荐