QT+OPenGL十九鏡面反射效率調(diào)整

image.png

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


image.png

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

算法

只需通過(guò):
光的方向向量和視線向量相加,然后將結(jié)果歸一化(normalize),就能活得結(jié)果。


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參數(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校正

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容