光照贴图
调整材质的环境光、漫反射以及镜面反射系数已经可以模拟出多种多样的材质,但是如果我们还想模拟更复杂的材质例如模拟砖墙的材质就十分困难了。但好在我们之前已经知道了如何表示复杂物体的表面,当然就是用纹理了。
将纹理和光照模型结合,我们就可以得到更为真实的物体,而我们仅仅需要将材质中ambient
和diffuse
参数修改成纹理取样器sampler2D
即可。
1 | struct Material{ |
这里对Material
赋值需要一点考究。由于GLSL中没有对自定义结构赋值的函数,所以对于一个结构体而言,需要我们逐条对其成员复制,例如赋值diffuse
就需要这样glUniform1i(glGetUniformLocation(ID,'material.diffuse'),value);
即直接按整数成员进行赋值。
然而设置完环境光和漫反射后会发现有些地方不该出现高光也出现了,例如像木头这种材质我们是不希望它出现高光的,这时候就需要镜面反射贴图了。和漫反射贴图不同的是,镜面反射贴图一般只有两种颜色,即黑和白,在需要出现高光的地方点缀白色,在不需要的地方涂黑,这样就可以把不需要高光的地方过滤掉。
将漫反射和镜面反射贴图相结合,我们就可以得到一个比较真实的物体了。用法也很简单,只要在原来材质的基础上,将ambient
、diffuse
和specular
统统替换成texture的颜色,本质上来说,也是一种颜色,只不过现在这个颜色不需要我们自己定义,而是直接利用纹理进行插值了。
1 | vec3 ambientLight=light.ambient*texture(material.diffuse,Texcoord).rgb; |
最后得到的效果将是这样,还是很有质感的。