记得上一次做年终总结还是在22年1月1日,转眼日历已经迈入了2024年。时间或许的确不存在,你往里面塞的事情越多,它就变得越长。2023,这一年真的很长,但同时也很短,现在就来回顾一下这一年吧。

阅读全文 »

从openGL的渲染管线图中可以看出,其实在顶点着色器和片段着色器之间还隐藏着一个着色器——几何着色器。这个着色器并不是必须的,如果不主动提供给openGL,它便会自己生成一个最基本几何着色器,即对顶点不做任何变换。

阅读全文 »

GLSL内建变量

顶点着色器

  1. gl_Position

这个在顶点着色器里面已经见的太多了,设置顶点的坐标这便是它全部的功能。

  1. gl_PointSize

这个变量可以在顶点着色器中设置每个顶点像素的宽高,但是一般是被禁用的,需要用glEnable(GL_PROGRAM_POINT_SIZE)进行开启。

阅读全文 »

立方体贴图其实很好理解,就是将二维的贴图变成立方体的,注意,立方体贴图其实并不是三维贴图,或者说立方体贴图只是三维贴图的特殊形式,因为它的形状恰好是一个正立方体,而一般的三维贴图形状可能并不是固定的。

阅读全文 »

到目前为止,我们已经掌握了很多缓冲,比如用来储存顶点的GL_ARRAY_BUFFER,用来储存顶点索引的GL_ELEMENT_ARRAY_BUFFER以及储存颜色的颜色缓冲,储存深度信息的深度缓冲等等,这些诸多缓冲其实就是构成每一帧画面的诸多要素,所以故而便存在一个储存这些所有缓冲的缓冲,便是帧缓冲。

和其他缓冲一样,帧缓冲的创建也是先创建,然后再绑定。glGenFramebuffers用来创建一个帧缓冲,再将帧缓冲用glBindFramebuffer绑定到GL_FRAMEBUFFER之后,便可以开始对其进行修改。刚创建好的帧缓冲其实是不完整的,一个完整的帧缓冲需要满足以下的条件:

阅读全文 »

混合

目前我们所有的操作都是建立在物体是完全不透明的前提下的,但是对于透明材质的物体,例如玻璃,我们应该怎么样去渲染呢?
我们在片段着色器输出颜色的时候会输出一个vec4类型的向量,而这个向量的第四个向量便是控制物体透明度的通道,又因为之前我们渲染的都是不透明的物体,所以这个通道都设置为了1,也即是完全不透明,相反的,完全透明的物体也就是0,这将使物体不会被渲染出来。而问题最大的便是那种半透明的物体,也即是物体本身带有一点颜色,但是可以透光,例如有色玻璃等等。所以我们需要将两种颜色进行混合从而达到这种半透明的效果。

阅读全文 »

模板测试简介

在几何着色器之后,渲染管线便来到了模板测试,这是一个在深度测试之前的测试。和深度测试一样,模板测试也是根据某个值将像素点剔除,只不过深度测试是通过深度值也就是Z轴值来剔除罢了。

阅读全文 »

在光照这一节中,我们简单的介绍了光照。但是实际上光还可以有多种形态,我们只要对其进行简单的数学操作,就可以得到不同的效果。

平行光

何谓平行光,其实就是光线的方向不会改变。例如太阳光,在同一时刻如果我们在地面插上两根等长的棍子,我们会发现棍子的影子应当是同等长度的。所以当我们要模拟平行光时,我们便只要将lightDir修改为一个定值即可,即不需要再根据像素位置和光源位置来计算了。

阅读全文 »

调整材质的环境光、漫反射以及镜面反射系数已经可以模拟出多种多样的材质,但是如果我们还想模拟更复杂的材质例如模拟砖墙的材质就十分困难了。但好在我们之前已经知道了如何表示复杂物体的表面,当然就是用纹理了。

将纹理和光照模型结合,我们就可以得到更为真实的物体,而我们仅仅需要将材质中ambientdiffuse参数修改成纹理取样器sampler2D即可。

阅读全文 »
0%