demo演示
面剔除
- 当我们都以逆时针绘制三角形顶点,那么从三角形的背面看就是顺时针,
- 面剔除正是根据这个原理,glEnable()首先启用,glCullFace()改变需要剔除的面类型(只剔除背向面,只剔除正向面,剔除正向面和背向面)
- glFrontFace()指定将正GL_CW/逆GL_CCW时针定义为正面
帧缓冲
- 帧缓冲定义:颜色缓冲,模板缓冲,深度缓冲,这些缓冲结合起来
- 我们可以定义自己的缓冲,也就是说我们能够定义我们自己的颜色缓冲,甚至是深度缓冲和模板缓冲,我们目前所做的所有操作都是在默认帧缓冲的渲染缓冲上进行的
- 作用:通过创建我们自己的帧缓冲,我们可以获得额外的渲染目标(纹理,渲染缓冲对象)
- 创建和绑定帧缓冲到GL_FRAMEBUFFER目标上(帧缓冲可以分别绑定到读取目标或写入目标)
- 完整帧缓冲:附加至少一个缓冲(颜色、深度或模板缓冲),至少有一个颜色附件(纹理)(我们可以附加多个颜色附件)还可以有其他附件(渲染缓冲对象),每个缓冲都应该有相同的样本数
- 创建和绑定帧缓冲到GL_FRAMEBUFFER
- 创建纹理附件:
- 当把一个纹理附加到帧缓冲glFrameBufferTexture2D的时候,所有的渲染指令将会写入到这个纹理中,
- 为帧缓冲创建一个纹理,
data
参数传递了NULL,
仅仅分配了内存而没有填充它,其中我们还可以将维度设置为了屏幕大小,并不关心环绕方式或多级渐远纹理 - glFrameBufferTexture2D()参数:
- 帧缓冲的目标类型,附加的附件类型(颜色附件GL_COLOR_ATTACHMENT,深度GL_DEPTH_ATTACHMENT和模板附件GL_STENCIL_ATTACHMENT),附加的纹理类型,要附加的纹理对象标识符,多级渐远纹理的级别
- 创建渲染缓冲对象附件:
- 它会将数据储存为OpenGL原生的渲染格式,它变为一个更快的可写储存介质。然而,渲染缓冲对象通常都是只写的,所以你不能读取它们
- 创建渲染缓冲对象附件和绑定到GL_RENDERBUFFER,它经常用于深度和模板附件,只关心深度和模板测试,不需要对它们进行采样
- glRenderbufferStorage创建一个深度和模板渲染缓冲对象(),GL_DEPTH24_STENCIL8作为内部格式,,24位的深度和8位的模板缓冲。glFramebufferRenderbuffer()渲染缓冲对象附加到帧缓冲:
- 帧缓冲的目标类型,附加的附件类型,渲染缓冲区对象的目标类型GL_RENDERBUFFER,要附加的渲染缓冲区对象的标识符
- 渲染到帧缓冲附件上;
- 绑定这个我们自己的帧缓冲对象,深度和模板操作都会从当前绑定的帧缓冲的深度和模板附件中读取
- 渲染场景,绘制场景,也就是,会渲染到自己的帧缓冲对象,附加的所有附件上
- 由于我们使用的每个帧缓冲都有它自己一套缓冲,需要调用glClear,清除这些缓冲区的内容(其实仅清除当前绑定的帧缓冲区中的颜色缓冲区)
- 解绑当前自己的帧缓冲 == 绑定默认的帧缓冲,禁用深度测试,绘制一个横跨整个屏幕的四边形,将帧缓冲的颜色缓冲作为它的纹理
- 后期处理:
- 后期处理:
- 反相:黑白反色,1 - 帧缓冲的vec4颜色
- 灰度:移除场景中除了黑白灰以外所有的颜色,将纹理的rgb颜色平均化
- 核效果:通过增强图像中的边缘和细节来提高图像清晰度和对比度,核的中心值是负数
- 模糊:平滑颜色值
- 边缘检测:捕捉图像中的不同物体之间的边界,和锐化核非常相似
- 核的具体实现:
- 创建3*3=9的偏移位置(offset = 1.0 / 300.0;)
- 创建3*3kernel数组,每个颜色值,for9次,卷积运算,求和后返回最终的颜色值
- 卷积矩阵:
- 作用:卷积可以用于图像锐化、模糊和边缘检测等操作
- 定义:卷积矩阵image,卷积核kernel(通常3*3),卷积结果
- 计算步骤:
- 卷积核矩阵翻转 180°
- 将卷积核h的中心对准x的第一个元素,然后对应元素相乘后相加,没有元素的地方补0。
- 卷积核中心从左上角顺序地行移动,直到抵达右下角。
- 后期处理: