
這是之前的phong著色的鏡面反射模型。
但是這存在效率問(wèn)題就是運(yùn)算反射光線的開(kāi)銷(xiāo)比較大。雖然思想很正確但是浪費(fèi)了顯卡的效率。
1977年James F. Blinn引入了Blinn-Phong著色優(yōu)化了這個(gè)部分。

使用半程向量H來(lái)替代反向光線向量R,這樣做雖然會(huì)導(dǎo)致效果出現(xiàn)一些不同(精確度降低了一些)但是可以通過(guò)參數(shù)的調(diào)整達(dá)到和phong著色相似的效果,且能適應(yīng)各種情況。
算法
只需通過(guò):
光的方向向量和視線向量相加,然后將結(jié)果歸一化(normalize),就能活得結(jié)果。

相信到這里著色器代碼一看就懂了
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參數(shù)要比以前phong著色大幾倍來(lái)達(dá)到之前的效果哦。
shader前后對(duì)比:
//計(jì)算鏡面反射強(qiáng)度
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三之矩陣簡(jiǎn)解
QT+OpenGL四之相機(jī)的移動(dòng)和旋轉(zhuǎn)
QT+OpenGL五之繪制不同的模型(vao,vbo機(jī)制)
QT+OpenGL六之天空盒
QT+OpenGL七之使用EBO
QT+OPenGL八之模型準(zhǔn)備
QT+OPenGL九之模型解碼
QT+OPenGL十之光照模型
QT+OPenGL十一之漫反射和鏡面反射貼圖
QT+OPenGL十二之定向光
QT+OPenGL十三之真正的點(diǎn)光源和聚光燈
QT+OPenGL十四之多光源混合的問(wèn)題
QT+OPenGL十五之深度緩沖區(qū)
QT+OPenGL十六之模板緩沖區(qū)
QT+OPenGL十七幀緩沖區(qū)(離屏渲染)
QT+OPenGL十八抗鋸齒
QT+OPenGL十九鏡面反射效率調(diào)整
QT+OPenGL二十Gamma校正