文件名称:基本光照效果-pt100换算表
文件大小:20.23MB
文件格式:PDF
更新时间:2024-07-31 06:22:35
OpenGL ES
6.2 基本光照效果 其具体代码如下。 代码位置:见随书中源代码/第 6 章/Sample6_1/assets 目录下的 frag.sh。 1 #version 300 es 2 precision mediump float; 3 uniform float uR; //从宿主程序中传入的球半径 4 in vec2 mcLongLat; //接收从顶点着色器过来的参数 5 in vec3 vPosition; //接收从顶点着色器过来的顶点位置 6 out vec4 fragColor; //输出的片元颜色 7 void main(){ 8 vec3 color; 9 float n = 8.0; //外接立方体每个坐标轴方向切分的份数 10 float span = 2.0*uR/n; //每一份的尺寸(小方块的边长) 11 int i = int((vPosition.x + uR)/span); //当前片元位置小方块的行数 12 int j = int((vPosition.y + uR)/span); //当前片元位置小方块的层数 13 int k = int((vPosition.z + uR)/span); //当前片元位置小方块的列数 14 //计算当前片元行数、层数、列数的和并对 2 取模,用于确定当前片元的颜色 15 int whichColor = int(mod(float(i+j+k),2.0)); 16 if(whichColor == 1) { //奇数时为红色 17 color = vec3(0.678,0.231,0.129); //红色 18 }else { //偶数时为白色 19 color = vec3(1.0,1.0,1.0); //白色 20 } 21 fragColor=vec4(color,0); //将计算出的颜色传递给管线 22 } 说明 上述片元着色器实现了如前一小节图 6-4 所示的棋盘着色器,其根据片元的位置 计算出片元所在小方块的行数、层数、列数,再根据 3 个数之和的奇偶性确定片元 所采用的颜色。 6.2 基本光照效果 完成了上一节中球体的开发后,下面的部分将基于此球体逐步介绍光照各个方面的知识。具体 计划为,首先介绍 OpenGL ES 3.0 中光照模型的基本知识,然后逐步为球体添加不同的光照效果。 6.2.1 光照的基本模型 如果要用一个数学模型完全真实地描述现实世界中的光照是很难的,一方面数学模型本身可 能太过复杂,另一方面复杂的模型可能导致巨大的计 算量。因此,OpenGL ES 3.0 中采用的光照模型相对 现实世界进行了很大的简化,将光照分成了 3 种组成 元素(也可以称为 3 个通道),包括环境光、散射光 以及镜面光,具体情况如图 6-5 所示。 提示 实际开发中,3 个光照通道是分别采用不同的数学模型独立计算的,下面的几个 小节将一一进行详细介绍。 6.2.2 环境光 环境光(Ambient)指的是从四面八方照射到物体上,全方位 360°都均匀的光。其代表的是 现实世界中从光源射出,经过多次反射后,各方向基本均匀的光。环境光最大的特点是不依赖于 光源的位置,而且没有方向性,图 6-6 简单地说明了这个问题。 ▲图 6-5 光的 3 个通道