現代OpenGL+Qt學習筆記之十一:使用halfway向量提高光照計算效率

現代OpenGL+Qt學習筆記之十一:使用halfway向量提高光照計算效率

主要內容

  本文介紹另一種光照計算的方法,可以減少光照計算的效率,當需要計算光照的的頂點/片元的較多時,使用該方法可以提高着色器的運行效率,從而提高渲染效率。

halfway向量

  現代OpenGL+Qt學習筆記之七:Phong光照及在GLSL中使用函數一文中已經介紹了Phong光照模型的原理及計算方法。本文將對鏡面反射光強(specular)成分的計算方法進行優化。從而達到提高光照計算效率的目的。

  在之前的介紹中,鏡面反射光強的計算是通過下列公式實現的:

Is=LsKs(rv)f

  其中向量r 是光的反射方向,v 是反射點到觀察點的方向。向量r 的計算公式爲:

r=s+2(sn)n

  共需要進行一次點乘運算、一次加法運算和多次乘法運算。下面就引入halfway向量h 來簡化鏡面反射光強的計算。

  我們定義h 爲如下向量:

h=v+s

  各向量之間的關係如下圖(h 在使用前需要進行單位化):

h向量

  注意到n 是向量rs halfway向量,而hvs 的halfway向量,不難證明,vr 之間的夾角是hn 之間的夾角的兩倍,因此rv 也是與hn 存在一定的正比例關係,因此在計算鏡面反射光強時,可以用hn 代替rv ,雖然計算結果不一樣,但是要表達的意義是一樣的。即有:

Is=LsKs(hn)f

  這樣做的好處很明顯,就是不需要計算s 而只需要進行一次加法計算就能得到h ,計算量大大減小,計算效率自然會提高。

  當然,在參數f 一定時,鏡面反射的效果會有所不同。

halfway向量的實現

  使用這種方式計算鏡面反射光強的方式非常簡單,只需要修改相關着色器程序中的部分代碼即可。在現代OpenGL+Qt學習筆記之七:Phong光照及在GLSL中使用函數一文源碼的頂點着色器中,修改部分代碼,首先刪除計算向量r 的行:

    vec3 r = reflect( -s, norm );

而增加計算向量 h 的代碼如下:

    vec3 h = normalize( v + s );

再將計算鏡面反射光強spec的語句改爲:

        spec = Light.Ls * Material.Ks *
               pow( max( dot(h, norm), 0.0 ), Material.Shininess );

  保存並運行程序,結果如下:

這裏寫圖片描述

  原始的未採用該方法計算的結果如下:

這裏寫圖片描述

  這裏因爲頂點較少,並沒有列出運行時間比較性能,不過從計算方式上看,肯定是在性能上有所優化的。從結果上看,當參數f 的值相同時,使用halfway向量的渲染結果的鏡面區域更大。

源碼地址:http://download.csdn.net/download/chaojiwudixiaofeixia/10014848

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章