QT+OPenGL十九镜面反射效率调整

image.png

这是之前的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校正

你可能感兴趣的:(QT+OPenGL十九镜面反射效率调整)