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)
{//初始化GLUTglutInit(&argc, argv);//显示模式:双缓冲、RGBAglutInitDisplayMode(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):当顶点短时间内不会被使用的时候,禁用它
OpenGL基础1:最简单的OpenGL例子相关推荐
- OpenGL基础25:多光源(附简单GLSL配置)
到这里,光照基础就已经接近尾声了,当然对于光照渲染的学习,这可能只是百步中的一步,尽管如此,至少还是做到了从 0 到 1 的一个过程,就像之前刚学会"HelloWorld"一样,一 ...
- OpenGL基础35:帧缓冲(下)之简单图像处理
在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风.将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个 ...
- 【OpenGL】计算机图形学实验一:OpenGL基础实验(实验环境的熟悉、简单图形的绘制和输出)
实验一:OpenGL基础实验 (实验环境的熟悉.简单图形的绘制和输出) 1.实验目的和要求 学习基本的OpenGL图形绘制和输出函数,掌握使用基于C++ OpenGL开发图形程序的流程. 2.实验设 ...
- OpenGL基础知识介绍和简单使用
OpenGL基础知识介绍 OpenGL简介 OpenGL 专业词解析 1.OpenGL上下文[context] 2.渲染 3.顶点数组和顶点缓冲区 4.着色器程序Shader 5.顶点着色器(Vert ...
- opengl基础学习专题 (二) 点直线和多边形
题外话 随着学习的增长,越来越觉得自己很水.关于上一篇博文中推荐用一个 学习opengl的 基于VS2015的 simplec框架.存在 一些问题. 1.这个框架基于VS 的Debug 模式下,没有考 ...
- OpenGL基础53:阴影映射(下)
接上文:OpenGL基础52:阴影映射(上) 五.阴影失真 按照上文的计算的结果,一个很明显的问题是:对于参与计算深度贴图的物体,其表面可以看到这样的栅格状的阴影,这种常见的错误表现也叫做阴影失真(S ...
- OpenGL基础46:切线空间
到这里,关于OpenGL基础的了解要接近尾声了,上一个节点是<OpenGL基础25:多光源>.在此章之后,学习openGL的各种教程的同时,可以转战想要了解的渲染引擎,也可以去github ...
- OpenGL基础41:几何着色器
在顶点着色器之后,片段着色器之前,还有几何着色器,它是可选的,在<OpenGL基础3:渲染管线>这一章中就有提到了,有了几何着色器后可以做很多骚操作,更容易实现很多有意思的效果 一.最简单 ...
- OpenGL基础40:Uniform缓冲
前置:OpenGL基础39:GLSL内建变量与接口块 想想之前代码,glUniform()和glGetUniformLocation()的使用数量是不是过于频繁了,对于每个着色器的每一个uniform ...
- OpenGL基础33:帧缓冲(上)之离屏渲染
在之前的章节,所有的物体都是中规中矩的显示的,只考虑了光照对物体的影响,那假设想要显示特殊的效果该怎么操作呢?例如马赛克风.将所有的物体都显示为黑白色,就像上世纪80年代的灰白电视一样,又或者说将整个 ...
最新文章
- Matlab数据的可视化 -- 饼图
- 夏夏的php开发笔记开写啦
- 蓝桥杯-递归求二项式系数值(java)
- leetcode475. 供暖器(二分查找)
- python 面试问题_值得阅读的30个Python面试问题
- 字典排序什么意思_字典排序问题
- 《Node应用程序构建——使用MongoDB和Backbone》一2.3 事件
- 最强联合!北大清华互相开放本科课程(附课程名单)
- ThinkPad SL400 改装Win2003方法以及驱动下载列表(适用于SL500)
- access建立er图_关于ER图的快速生成 | 学步园
- python单例模式及使用场景(跨文件全局变量)
- 计算机剪切全选快捷键,全选快捷键是什么
- 微信内无法分享转发网址链接,谈谈微信网址防屏蔽的办法
- 报错Uncaught ReferenceError: *** is not defined at HTMLTableRowElement.onc
- 如何保证同事的代码不会腐烂?一文带你了解 阿里巴巴 COLA 架构
- 微信app支付和公众号内支付JSAPI
- 宅男福利!我用Python做了一个B站跳舞的小姐姐,满屏的美腿!
- scrapy--Beautyleg
- 无限创世5.0.0游戏
- 学习Lua编写魔兽插件 for wow addons
热门文章
- python 菜鸟-python菜鸟教程
- 为什么黑客都用python-终于发现为什么黑客都用python
- vb还是python强大-Python可以代替vb吗
- 学python可以从事什么工作-学Python可以找什么工作或者做什么兼职?
- python有道-Python爬取有道词典
- python爬虫实例100例-Python 练习实例1
- 日语+AI语音黑科技,早道开启小语种AI智能时代!
- nginx 负载均衡 404_Nginx+.Net Core实现项目负载均衡
- JavaScript-箭头函数
- c语言mpi矩阵乘法,【MPI并行程序】矩阵乘法