这是之前的phong着色的镜面反射模型。
但是这存在效率问题就是运算反射光线的开销比较大。虽然思想很正确但是浪费了显卡的效率。
1977年James F. Blinn引入了Blinn-Phong着色优化了这个部分。
image.png
使用半程向量H来替代反向光线向量R,这样做虽然会导致效果出现一些不同(精确度降低了一些)但是可以通过参数的调整达到和phong着色相似的效果,且能适应各种情况。
算法
只需通过:
光的方向向量和视线向量相加,然后将结果归一化(normalize),就能活得结果。
image.png
相信到这里着色器代码一看就懂了
vec3 lightDir = normalize(lightPos - FragPos);
vec3 viewDir = normalize(viewPos - FragPos);
vec3 halfwayDir = normalize(lightDir + viewDir);
float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);
vec3 specular = lightColor * spec;
shininess参数要比以前phong着色大几倍来达到之前的效果哦。
shader前后对比:
//计算镜面反射强度
vec3 viewDir = normalize(cameraPos - worldPos);
//vec3 reflectDir = reflect(-lightDir, normal);这是原phong
vec3 halfwayDir =normalize(viewDir+lightDir);//这是Blinn phong
//float specularStringth = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);原phong
float specularStringth = pow(max(dot(normal, halfwayDir), 0.0), material.shininess);//blinn phong
目录
VSC++2019+QT+OpenGL
QT+OpenGL一之绘制立方体(三角形图元)
QT+OpenGL二之纹理贴图
QT+OpenGL三之矩阵简解
QT+OpenGL四之相机的移动和旋转
QT+OpenGL五之绘制不同的模型(vao,vbo机制)
QT+OpenGL六之天空盒
QT+OpenGL七之使用EBO
QT+OPenGL八之模型准备
QT+OPenGL九之模型解码
QT+OPenGL十之光照模型
QT+OPenGL十一之漫反射和镜面反射贴图
QT+OPenGL十二之定向光
QT+OPenGL十三之真正的点光源和聚光灯
QT+OPenGL十四之多光源混合的问题
QT+OPenGL十五之深度缓冲区
QT+OPenGL十六之模板缓冲区
QT+OPenGL十七帧缓冲区(离屏渲染)
QT+OPenGL十八抗锯齿
QT+OPenGL十九镜面反射效率调整
QT+OPenGL二十Gamma校正
网友评论