現代OpenGL+Qt學習筆記之十一:使用halfway向量提高光照計算效率
主要內容
本文介紹另一種光照計算的方法,可以減少光照計算的效率,當需要計算光照的的頂點/片元的較多時,使用該方法可以提高着色器的運行效率,從而提高渲染效率。
halfway向量
現代OpenGL+Qt學習筆記之七:Phong光照及在GLSL中使用函數一文中已經介紹了Phong光照模型的原理及計算方法。本文將對鏡面反射光強(specular)成分的計算方法進行優化。從而達到提高光照計算效率的目的。
在之前的介紹中,鏡面反射光強的計算是通過下列公式實現的:
其中向量
共需要進行一次點乘運算、一次加法運算和多次乘法運算。下面就引入halfway向量
我們定義
各向量之間的關係如下圖(
注意到
這樣做的好處很明顯,就是不需要計算
當然,在參數
halfway向量的實現
使用這種方式計算鏡面反射光強的方式非常簡單,只需要修改相關着色器程序中的部分代碼即可。在現代OpenGL+Qt學習筆記之七:Phong光照及在GLSL中使用函數一文源碼的頂點着色器中,修改部分代碼,首先刪除計算向量
vec3 r = reflect( -s, norm );
而增加計算向量
vec3 h = normalize( v + s );
再將計算鏡面反射光強spec的語句改爲:
spec = Light.Ls * Material.Ks *
pow( max( dot(h, norm), 0.0 ), Material.Shininess );
保存並運行程序,結果如下:
原始的未採用該方法計算的結果如下:
這裏因爲頂點較少,並沒有列出運行時間比較性能,不過從計算方式上看,肯定是在性能上有所優化的。從結果上看,當參數
源碼地址:http://download.csdn.net/download/chaojiwudixiaofeixia/10014848