
OpenGL学习笔记
文章平均质量分 50
木千
这个作者很懒,什么都没留下…
展开
-
OpenGL学习笔记:几何着色器
之前还有一节介绍高级数据处理的,和这节的几何着色器都很好理解,没啥可总结的,直接上例子代码#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <glm/glm.hpp>#include <glm/gtc/matrix_transfo...原创 2019-09-19 14:46:39 · 11507 阅读 · 0 评论 -
OpenGL学习笔记:立方体贴图
这一节很好理解,不需要多做说明,下面的例子程序的顶点数据和原版例子略有不同,注意法线向量#include <glad/glad.h>#include <GLFW/glfw3.h>#include <stb_image.h>#include <glm/glm.hpp>#include <glm/gtc/matrix_transfor...原创 2019-09-18 14:01:21 · 11661 阅读 · 0 评论 -
OpenGL学习笔记:帧缓冲
这节课很好理解,需要注意的是,在向自定义的帧缓冲中写如像素数据的时候,数据会被写入到帧缓冲的纹理附件中。在本节课的示例程序中,首先向帧缓冲的纹理附件写入地板,箱子的图像数据,然后通过读取帧缓冲的纹理附件的数据,写入到默认缓冲的着色器中,并在着色器中进行颜色修改,以达到各种效果,相当于是加了一个滤镜#include <glad/glad.h>#include <GLFW/gl...原创 2019-09-17 17:37:53 · 11439 阅读 · 0 评论 -
OpenGL学习笔记:面剔除
本节的内容是在定义顶点的时候确定三角形顶点的顺序,然后根据顺序确定物体的正面和背面,在渲染的时候就可以删除被挡住的一面从而提高绘图效率本例中和原教程略有不同的是,由于懒得重写代码,将上节的混合内容删除,留下了地板和两个箱子,如果直接使用面剔除,由于地板和箱子的正面和背面不同,所以要在渲染循环中,每次绘制之前,改变剔除面的行为,从而不影响画面显示#include <glad/glad.h&...原创 2019-09-16 16:35:32 · 11439 阅读 · 0 评论 -
OpenGL学习笔记:混合
丢弃片段第一种混合的方法很简单,直接将alpha值为0的片段丢弃即可,这个可以在片段着色器中进行简单处理,需要注意的是,当采样纹理的边缘的时候,OpenGL会对边缘的值和纹理下一个重复的值进行插值(因为我们将它的环绕方式设置为了GL_REPEAT。这通常是没问题的,但是由于我们使用了透明值,纹理图像的顶部将会与底部边缘的纯色值进行插值。这样的结果是一个半透明的有色边框,你可能会看见它环绕着你的纹...原创 2019-09-16 16:06:05 · 11454 阅读 · 0 评论 -
OpenGL学习笔记:模版测试
模版测试的作用就是给我们提供一种可以控制片段绘制的方法,让我们的绘图更为灵活。本节中绘制边框的例子的设计思想也很容易理解,具体可以看下面代码的中文注释。原版教程中有这么一句话:“我们将模板函数设置为GL_NOTEQUAL,它会保证我们只绘制箱子上模板值不为1的部分,即只绘制箱子在之前绘制的箱子之外的部分。注意我们也禁用了深度测试,让放大的箱子,即边框,不会被地板所覆盖。”他的想法我理解,可为什...原创 2019-09-11 19:40:39 · 11424 阅读 · 0 评论 -
OpenGL学习笔记:深度缓冲
之前为了方便理解,代码尽量不封装。这节以后,凡是涉及到新东西的尽量不去封装,而不涉及新东西的,为了代码的简洁,尽量去封装了深度缓冲我们观察空间中的两个物体,后面的物体被前面的物体挡住,我们是看不到被挡住的部分的,而深度缓冲可以简单理解为就是标识这个“前后”的值。缓冲测试OpenGL是一个3D世界,但显示设备通常是2D的。前面介绍过,要将一个3D图像转换为屏幕的2D图像,需要经过裁剪。在裁剪...原创 2019-09-09 17:52:48 · 11826 阅读 · 0 评论 -
OpenGL学习笔记:加载模型
加载模型需要使用Assimp来屏蔽掉不同工具的模型文件,Assimp的gayhub简单说一下,不同的3D编辑工具生成的模型文件格式是不同的,Assimp的作用就是将不同的模型文件转换成相同的格式,然后OpenGL再将Assimp的格式转换成OpenGL的数据格式。Assimp是怎么转换其他模型格式的我们不需要关心,但是我们需要关心转换后的统一的数据格式,因为我们需要将这个格式转换到OpenGL中...原创 2019-09-06 10:13:16 · 11620 阅读 · 0 评论 -
OpenGL学习笔记:多个光源
这一节没有新东西,都是对之前光源进行一个综合应用,着色器代码中增加的函数和数组的使用方法#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IMAGE_IMPLEMENTATION#include...原创 2019-09-05 11:34:59 · 11742 阅读 · 0 评论 -
OpenGL学习笔记:投光物
平行光这部分好理解,只贴出着色器代码,注意:这里删除了灯源位置,添加了无限远光源的方向#version 330 core// 定义材质结构体struct Material {// vec3 ambient; // 移除了环境光材质颜色向量,因为环境光颜色在几乎所有情况下都等于漫反射颜色,所以我们不需要将它们分开储存 sampler2D diffuse; // 将之前定义的...原创 2019-09-04 17:54:19 · 11738 阅读 · 0 评论 -
OpenGL学习笔记:光照贴图
漫反射贴图简单说就是在上一节的基础上给物体添加上纹理,主要做两件事,将之前定义的vec3漫反射颜色向量替换为漫反射贴图,删除环境光源这里就不贴完整例子了,简单说一下着色器的主要修改,添加纹理的部分就不贴了,详见前面纹理部分的章节,记得更新顶点着色器的数据,将纹理添加进去#version 330 core// 定义材质结构体struct Material {// vec3 ambi...原创 2019-09-02 19:03:08 · 11569 阅读 · 0 评论 -
OpenGL学习笔记:矩阵变换
缩放前面说了一大堆的理论,现在终于可以来点实际应用了对一个向量进行缩放(Scaling)就是对向量的长度进行缩放,而保持它的方向不变。我们先来尝试缩放向量v⃗=(3,2)\vec{v} =(3,2)v=(3,2)。我们可以把向量沿着x轴缩放0.5,使它的宽度缩小为原来的二分之一;我们将沿着y轴把向量的高度缩放为原来的两倍。我们看看把向量缩放(0.5, 2)倍所获得的s⃗\vec{s}s是什么...原创 2019-08-23 20:42:31 · 12223 阅读 · 0 评论 -
OpenGL学习笔记:数学基础
本篇对OpenGL学习过程中遇到的关键的矩阵运算做一个总结,方便以后查阅。向量向量高中就接触了,这个问题应该不大,向量就是一个有方向的量,具有平移不变性,因此我们可以默认所有的向量都是以0点为起点,这样就可以只用一个点就表示出一个向量了。在高中所接触的向量通常是在平面坐标系中,后来又扩展到了空间坐标系,此时的向量具有几何意义。但是,在线性代数中的向量可以向N维扩展,超过三维以上就失去了几何意义...原创 2019-08-23 20:41:57 · 11733 阅读 · 0 评论 -
OpenGL学习笔记:材质
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#include <glm/glm.hpp>...原创 2019-08-22 17:46:52 · 11642 阅读 · 0 评论 -
OpenGL学习笔记:法线矩阵和镜面光照
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#include <glm/glm.hpp>...原创 2019-08-22 16:04:08 · 11799 阅读 · 0 评论 -
OpenGL学习笔记:基础光照
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#include <glm/glm.hpp>...原创 2019-08-22 15:56:20 · 11545 阅读 · 0 评论 -
OpenGL学习笔记:颜色
我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色。例如,太阳光能被看见的白光其实是由许多不同的颜色组合而成的(如下图所示)。如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有子颜色,不被吸收的蓝色光被反射到我们的眼...原创 2019-08-21 17:54:05 · 11868 阅读 · 0 评论 -
OpenGL学习笔记:摄像机
OpenGL本身没有摄像机(Camera)的概念,但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。场景旋转本例渲染循环以外的代码和之前章节一样,因此这里只给出渲染循环的代码// 创建渲染循环while (!glfwWindowShouldClose(window)){ // 处理输入事件 processInput(win...原创 2019-08-21 14:52:56 · 12261 阅读 · 0 评论 -
OpenGL学习笔记:多个立方体
现在我们想在屏幕上显示10个立方体。每个立方体看起来都是一样的,区别在于它们在世界的位置及旋转角度不同。立方体的图形布局已经定义好了,所以当渲染更多物体的时候我们不需要改变我们的缓冲数组和属性数组,我们唯一需要做的只是改变每个对象的模型矩阵来将立方体变换到世界坐标系中。#include <glad/glad.h>#include <GLFW/glfw3.h>#inc...原创 2019-08-20 17:57:03 · 12452 阅读 · 1 评论 -
OpenGL学习笔记:使用深度缓冲(Depth Buffer)创建一个旋转的立方体
如果不使用深度缓冲,创建的立方体的某些本应被遮挡住的面被绘制在了这个立方体其他面之上。OpenGL是一个三角形一个三角形地来绘制你的立方体的,所以即便之前那里有东西它也会覆盖之前的像素。因为这个原因,有些三角形会被绘制在其它三角形上面,虽然它们本不应该是被覆盖的。幸运的是,OpenGL存储深度信息在一个叫做Z缓冲(Z-buffer)的缓冲中,它允许OpenGL决定何时覆盖一个像素而何时不覆盖。通...原创 2019-08-20 17:41:54 · 12642 阅读 · 0 评论 -
OpenGL学习笔记:坐标系统
为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip ...原创 2019-08-20 17:29:32 · 11675 阅读 · 0 评论 -
OpenGL学习笔记:图形变换
这一章需要有矩阵相关的数学知识,如果相关知识薄弱,可以先去复习一下线性代数中矩阵相关的内容本例新加入一个叫做GLM的矩阵数学库,官网在这里#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IM...原创 2019-08-19 17:44:14 · 11836 阅读 · 0 评论 -
OpenGL学习笔记:多个纹理
/****************************************************************************你可能会奇怪为什么sampler2D变量是个uniform,我们却不用glUniform给它赋值。使用glUniform1i,我们可以给纹理采样器分配一个位置值,这样的话我们能够在一个片段着色器中设置多个纹理。一个纹理的位置值通常称为一个纹...原创 2019-08-09 17:38:13 · 15649 阅读 · 1 评论 -
OpenGL学习笔记:单一纹理
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"const unsigned int SCR_WIDTH ...原创 2019-08-09 16:52:20 · 11614 阅读 · 0 评论 -
OpenGL学习笔记:着色器
着色器输入输出关联当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。下面的代码展示了一个着色器的输出作为一个着色器的输入,vec4 vertexColor就是关联变量,可将该着色器定义替换掉之前的测试代码看效果,重复代码就不贴了// 定义顶点着色器const char *vertexShaderSource = "#ver...原创 2019-08-09 15:32:07 · 11329 阅读 · 0 评论 -
OpenGL学习笔记:使用索引缓冲对象
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>const unsigned int SCR_WIDTH = 800;const unsigned int SCR_HEIGHT = 600;// 定义顶点着色器c...原创 2019-08-09 15:13:31 · 11558 阅读 · 0 评论 -
OpenGL学习笔记:你好,三角形
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>const unsigned int SCR_WIDTH = 800;const unsigned int SCR_HEIGHT = 600;// 定义顶点着色器c...原创 2019-08-09 14:50:30 · 11271 阅读 · 0 评论 -
OpenGL学习笔记:你好,窗口
#include <glad/glad.h>#include <GLFW/glfw3.h>#include <iostream>#include <windows.h>const unsigned int SCR_WIDTH = 800;const unsigned int SCR_HEIGHT = 600;void framebu...原创 2019-08-09 14:48:18 · 11390 阅读 · 0 评论