![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OpenGL学习笔记
牛神自
好好学习,天天向上...
展开
-
OpenGL-实战篇--Breakout--结语--56
学习链接:中文----------英语原文一些优化方向!完结撒花!原创 2021-11-11 13:40:39 · 65 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--渲染文本--55
学习链接:中文---------英语原文这一节主要给界面添加一些文字信息,也是这个教程的最后一个章节(后面还有个结语)。TextRenderer.h:#pragma once//放前面:里面包含有glad.h#include "Shader.h"#include <GLFW/glfw3.h>#include <glm/glm.hpp>#include <map>#include "Texture2D.h"struct Character{ GL原创 2021-11-11 13:38:14 · 227 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--音效--54
学习链接:中文--------英语原文给游戏添加音乐!参考上文链接导入相应的头文件和lib、DLL即可。Game.cpp:#include "ResourceManager.h"#include "Game.h"#include "SpriteRenderer.h"#include "BallObject.h"#include "ParticleGenerator.h"#include "PostProcessor.h"#include <irrklang/irrKlang.h&g原创 2021-11-11 10:16:14 · 3130 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--道具--53
学习链接:中文--------英语原文这一节添加一些道具增加趣味性。源码:PowerUp.h:#pragma once#include <glm/glm.hpp>#include "GameObject.h"const glm::vec2 SIZE(60, 20);const glm::vec2 VELOCITY(0.0f, 150.0f);class PowerUp :public GameObject{public: //道具类型 std::string ty原创 2021-11-10 18:20:09 · 189 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--后处理--52
学习链接:中文--------英语原文这一节主要是后处理,添加一些特效,如:击中石块震动模糊,还有反色和边缘检测。源码:PostProcessor.h:#pragma once#include "Shader.h"#include "Texture2D.h"class PostProcessor{public: Shader postProcessingShader; Texture2D texture; GLuint width, height; GLboolean conf原创 2021-11-10 10:36:15 · 308 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--Particles--51
学习链接:中文---------英语原文这一节主要讲粒子,还是不较好理解的,类似Unity的粒子系统,但这里是比较简单的。ParticleGenerator.h:#pragma once//注意把Shader.h放在前面#include "Shader.h"#include <GLFW/glfw3.h>#include <glm/glm.hpp>#include "Texture2D.h"#include "GameObject.h"#include <v原创 2021-11-09 16:31:47 · 2679 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--CollisionResolution--50
学习链接:中文-----英语原文原创 2021-11-08 13:59:18 · 122 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--CollisionDetection--49
学习链接:中文------英语原文这一节在上一节的基础上添加了碰撞检测:有两种形状的检测:方形和方形,方形和圆形具体理论看上面链接。Game.cpp:#include "ResourceManager.h"#include "Game.h"#include "SpriteRenderer.h"#include "BallObject.h"SpriteRenderer* renderer;Game::Game(GLuint w, GLuint h) :state(GAME_ACTIVE)原创 2021-11-08 13:57:00 · 89 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--Ball--48
学习链接:中文---------英语原文这一节下上一节基础上添加了小球。头文件:BallObject.h:#pragma once#include "GameObject.h"class BallObject :public GameObject{public: //ball state GLfloat radius; GLboolean stuck; //constructor BallObject(); BallObject(glm::vec2 pos, GLfloat r原创 2021-11-08 10:23:57 · 112 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--Levels--47
学习链接:中文--------英语原文这一节在上节的基础上增加了关卡和GameObject类的抽象。把每个元素抽象为GameObject:包含一些属性(如:位置、颜色、大小、旋转等等),根据需要增删。关卡可以理解为GameObjects的一个容器,管理所有GameObject,方便管理。头文件:GameObject.h:#pragma once//注意把SpriteRenderer.h放在前面(里面包含的有glad.h)#include "SpriteRenderer.h"#includ原创 2021-11-08 09:31:49 · 96 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--RenderingSprites--46
学习链接:中文------英语原文原创 2021-11-06 16:07:10 · 173 阅读 · 0 评论 -
OpenGL-实战篇--Breakout--准备工作--45
终于开始实战了!学习链接:中文--------英语原文原创 2021-11-02 08:37:46 · 64 阅读 · 0 评论 -
OpenGL-实战篇--文本渲染--44
参考链接:中文-------英语原文原创 2021-11-01 17:51:34 · 171 阅读 · 0 评论 -
OpenGL-实战篇--调试--43
参考链接:中文------英语原文原创 2021-11-01 17:49:37 · 275 阅读 · 0 评论 -
OpenGL-PBR篇--IBL镜面-42
站位站位站位站位站位站位站位站位站位站位站位原创 2021-11-01 17:47:24 · 130 阅读 · 0 评论 -
OpenGL-PBR篇--IBL漫反射辐照度-41
1111111111111111123原创 2021-11-01 17:46:39 · 299 阅读 · 0 评论 -
OpenGL-PBR篇--Lighting-40
asdasda原创 2021-11-01 17:46:02 · 141 阅读 · 0 评论 -
OpenGL-PBR篇--PBR理论-39
这一节纯理论!学习链接:中文-------英语原文文章最后还有推荐的其他完整链接!!!原创 2021-11-01 14:54:19 · 111 阅读 · 0 评论 -
OpenGL高级光照篇--SSAO-38
学习链接:中文 -------- 英语原文原创 2021-10-28 17:53:46 · 175 阅读 · 0 评论 -
OpenGL高级光照篇--Deferred Shading-37
参考:中文 ---- 英语原文源码:deferred shading光体积优化后的源码:优化后的源码理论知识看原文!光体积优化这个方法仍然有一个问题:面剔除(Face Culling)需要被启用(否则我们会渲染一个光效果两次),并且在它启用的时候用户可能进入一个光源的光体积,然而这样之后这个体积就不再被渲染了(由于背面剔除),这会使得光源的影响消失。这个问题可以通过一个模板缓冲技巧来解决。渲染光体积确实会带来沉重的性能负担,虽然它通常比普通的延迟渲染更快,这仍然不是最好的优化。另外两个基原创 2021-10-28 16:52:13 · 134 阅读 · 0 评论 -
OpenGL高级光照篇--Bloom-36
学习链接:中文英语原文理论知识!Bloom原理还是比较简单的:提取图像亮部区域,模糊,与原图合成。质量的好坏在于模糊这部选择的算法!源码地址:Bloom#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <glm/glm.hpp>#include <glm/gtc/matrix_transform.hpp>#include &原创 2021-10-27 17:52:06 · 214 阅读 · 0 评论 -
OpenGL高级光照篇--HDR-35
参考:中文英语理论知识看链接吧!原创 2021-10-26 18:14:29 · 144 阅读 · 0 评论 -
OpenGL高级光照篇--视差贴图-34
参考链接:中文原文理解:英文和上节一样,主要是理论知识!代码和上节基本一样,只不过在加一个深度图的代码; unsigned int diffuseMap = loadTexture("Images/wood.png"); unsigned int normalMap = loadTexture("Images/toy_box_normal.png"); unsigned int depthMap = loadTexture("Images/toy_box_disp.png"); //shad原创 2021-10-26 17:56:59 · 151 阅读 · 0 评论 -
OpenGL高级光照篇--法线贴图-33
参考链接:这里具体理论看上面!原创 2021-09-10 14:20:33 · 117 阅读 · 0 评论 -
OpenGL高级光照篇--点阴影-32
参考:这里和上节的原理一样,只不过点阴影需要用立方体贴图,就需要6个面的贴图。详细看上面链接:程序代码:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <glm/glm.hpp>#include <glm/gtc/matrix_transform.hpp>#include <glm/gtc/type_ptr.hpp>原创 2021-05-24 11:44:07 · 153 阅读 · 0 评论 -
OpenGL高级光照篇--阴影映射-31
参考:学习链接阴影失真:这里解释的很好!当前实时渲染领域还没找到一种完美的阴影算法。目前有几种近似阴影技术,但它们都有自己的弱点和不足,这点我们必须要考虑到。视频游戏中较多使用的一种技术是阴影贴图(shadow mapping),效果不错,而且相对容易实现。具体理论参考上面链接!可视化深度图:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <g原创 2021-05-21 14:48:11 · 409 阅读 · 0 评论 -
OpenGL高级光照篇--伽马矫正-30
参考:这里理论知识!参考上面链接!主要思想:自己理解的我们shader中需要的数据是线性数据,最终在显示器上显示时会施加一个Gamma转换,导致数据不是我们想要的,画面变暗!所以我们需要在着色器最后阶段进行Gamma矫正,这样在显示器显示时再转换就是我们想要的线性值了!特别对于物体的贴图,基本上遵循sRGB颜色空间,意思就是已经Gamma矫正过了,所以我们采样使用时,需要转换为线性值进行计算。但对于法线贴图和凹凸贴图的线性空间贴图则不需要转换到线性空间,因为本身就是线性空间。...原创 2021-05-20 18:28:23 · 150 阅读 · 0 评论 -
OpenGL高级光照篇--高级光照-29
参考:这里这一节主要对Pong光照模型的高光进行优化,采用Blinn-Phong处理高光。Blinn-Phong模型与冯氏模型非常相似,但是它对镜面光模型的处理上有一些不同,让我们能够解决之前提到的问题。Blinn-Phong模型不再依赖于反射向量,而是采用了所谓的半程向量(Halfway Vector),即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近时,镜面光分量就越大。vec3 lightDir = normalize(lightPos - FragPos);vec3原创 2021-05-20 18:16:40 · 170 阅读 · 0 评论 -
OpenGL高级OpenGL篇--抗锯齿-28
参考:这里有一种叫做超采样抗锯齿(Super Sample Anti-aliasing, SSAA)的技术,它会使用比正常分辨率更高的分辨率(即超采样)来渲染场景,当图像输出在帧缓冲中更新时,分辨率会被下采样(Downsample)至正常的分辨率。这些额外的分辨率会被用来防止锯齿边缘的产生。虽然它确实能够解决走样的问题,但是由于这样比平时要绘制更多的片段,它也会带来很大的性能开销。所以这项技术只拥有了短暂的辉煌。多重采样:每个像素的中心包含有一个采样点(Sample Point),它会被用来决定这个三原创 2021-05-20 17:53:31 · 527 阅读 · 0 评论 -
OpenGL高级OpenGL篇--实例化-27
参考:添加链接描述如果我们需要渲染大量物体时,代码看起来会像这样:for(unsigned int i = 0; i < amount_of_models_to_draw; i++){DoSomePreparations(); // 绑定VAO,绑定纹理,设置uniform等glDrawArrays(GL_TRIANGLES, 0, amount_of_vertices);}如果像这样绘制模型的大量实例(Instance),你很快就会因为绘制调用过多而达到性能瓶颈。与绘制顶点本身相比,使原创 2021-05-20 17:26:10 · 336 阅读 · 1 评论 -
OpenGL高级OpenGL篇--几何着色器-26
参考:这里在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader),几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而,几何着色器最有趣的地方在于,它能够将(这一组)顶点变换为完全不同的图元,并且还能生成比原来更多的顶点。详细参考链接!程序代码:#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h&原创 2021-05-19 08:34:41 · 187 阅读 · 0 评论 -
OpenGL高级OpenGL篇--高级GLSL-25
参考:这里这一节会或多或少涉及GLSL的一些有趣的地方以及一些很棒的技巧,它们可能在今后会帮助到你。简单来说,它们就是在组合使用OpenGL和GLSL创建程序时的一些最好要知道的东西,和一些会让你生活更加轻松的特性。主要设计三个方面:1.GLSL的内建变量2.接口块3.Uniform缓冲对象内建变量:顶点着色器变量:1.gl_Position:我们已经用过,顶点着色器的裁剪空间输出位置向量。2.gl_PointSize:默认是禁用的,启用glEnable(GL_PROGRAM_POINT原创 2021-05-14 10:57:38 · 295 阅读 · 0 评论 -
OpenGL高级OpenGL篇--高级数据-24
参考:这里这一节主要讲OpengGL高级数据用法。详细参考上面。下面列出来,也方便自己看。OpenGL中的缓冲只是一个管理特定内存块的对象,没有其它更多的功能了。在我们将它绑定到一个缓冲目标(Buffer Target)时,我们才赋予了其意义。当我们绑定一个缓冲到GL_ARRAY_BUFFER时,它就是一个顶点数组缓冲,但我们也可以很容易地将其绑定到GL_ELEMENT_ARRAY_BUFFER。OpenGL内部会为每个目标储存一个缓冲,并且会根据目标的不同,以不同的方式处理缓冲。到目前为止,我们一原创 2021-05-14 10:24:56 · 195 阅读 · 0 评论 -
OpenGL高级OpenGL篇--立方体贴图-23
参考:这里程序代码:这是最终优化版本,先画其他物体,最后画天空盒,需要设置深度测试函数为小于等于,画完之后再改为默认值:小于,所以需要在天空盒的Shader里把裁剪空间的坐标Z设为W,这样在做齐次除法时,深度值恒为1,所以上面设置的深度测试函数可以通过!#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <glm/glm.hpp>#include原创 2021-05-12 12:53:06 · 240 阅读 · 0 评论 -
OpenGL高级OpenGL篇--帧缓冲--后处理效果--22--1
参考:文章后半部分这一节主要利用上一节的帧缓冲做后处理效果!程序代码和上节一样。不一样的是Shader代码,主要是片元shader:下面是几种效果:1.反相#version 330 coreout vec4 fragColor;in vec2 uv;//自定义帧缓冲-颜色附件缓冲uniform sampler2D screenTexture;void main(){ //反相:反转采样颜色即可 fragColor=vec4(1-texture(screenTexture,u原创 2021-05-12 09:50:51 · 631 阅读 · 0 评论 -
OpenGL高级OpenGL篇--帧缓冲-22
参考:这里这一节理论较多!具体参考上面链接!到目前为止,我们已经使用了很多屏幕缓冲了:用于写入颜色值的颜色缓冲、用于写入深度信息的深度缓冲和允许我们根据一些条件丢弃特定片段的模板缓冲。这些缓冲结合起来叫做帧缓冲(Framebuffer),它被储存在内存中。OpenGL允许我们定义我们自己的帧缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲。我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的。默认的帧缓冲是在你创建窗口的时候生成和配置的(GLFW帮我们做了这些)。有了我们自己原创 2021-05-11 18:32:42 · 293 阅读 · 0 评论 -
OpenGL高级OpenGL篇--面剔除-21
参考:添加链接描述OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)。使用OpenGL的面剔除选项,它默认是禁用状态的。启用面剔除:glEnable(GL_CULL_FACE);改变需要原创 2021-05-11 16:46:45 · 239 阅读 · 0 评论 -
OpenGL高级OpenGL篇--混合-20
参考:这里这一节主要讲混合。AlphaTest和正常的渲染一样,只需在片元shader中判断alpha和给定的阈值大小来discard片元。Blend步骤会多一些:首先要开启混合:glEnable(GL_BLEND);设置混合方程:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);或者单独设置Alpha:glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZER原创 2021-05-11 16:12:14 · 692 阅读 · 0 评论 -
OpenGL高级OpenGL篇--模板测试-19
参考:这里这一节和上一节的深度测试一样,理论知识,用模板测试可以实现一些特殊效果:如外轮廓。场景中物体轮廓的完整步骤会看起来像这样://打开深度测试glEnable(GL_DEPTH_TEST);//设置模板操作:这里是模板和深度测试通过替换模板缓冲里的值glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); //记得清除glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER原创 2021-05-11 13:23:43 · 185 阅读 · 0 评论 -
OpenGL高级OpenGL篇--深度测试--18
参考:这里这一节基本都是理论知识点。启用深度测试glEnable(GL_DEPTH_TEST);还应该在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则你会仍在使用上一次渲染迭代中的写入的深度值:glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);在某些情况下你会需要对所有片段都执行深度测试并丢弃相应的片段,但不希望更新深度缓冲。基本上来说,你在使用一个只读的(Read-only)深度缓冲。OpenGL允许我们禁用深原创 2021-05-11 11:14:46 · 407 阅读 · 0 评论