OpenGL ES ????????????光照計(jì)算

光照基礎(chǔ)

  • 環(huán)境光
  • 漫反射光
  • 鏡面光

光照特性

  • 發(fā)射光:由物體自身發(fā)光
  • 環(huán)境光:環(huán)境中充分散射的光,而且無法分辨它的方向
  • 漫反射光:光線來自某個(gè)方向,但在物體各個(gè)方向反射
  • 鏡面高光:光線來自一個(gè)特定的方向站削,然后在物體表面上以一個(gè)特定的方向反射出去
  • 材質(zhì)屬性

    • ?泛射材質(zhì)
    • ?漫反射材質(zhì)?
    • ?鏡面反射材質(zhì)
    • ?發(fā)射材質(zhì)

    光照計(jì)算

    環(huán)境光的計(jì)算

    1. 環(huán)境光的計(jì)算
    ? ? ?????環(huán)境光 = 光源的環(huán)境光顏色 * 物體的材質(zhì)顏色


    環(huán)境光的計(jì)算(亮度)

    2. 環(huán)境光GLSL實(shí)現(xiàn)

    varying vec3 objectColor;
    void main()
    {
    //?至少有%10的光找到物體所有?面
    ?float ambientStrength = 0.1;
    //環(huán)境光顏?色
    vec3 ambient = ambientStrength * lightColor;
    //最終顏?色?=?環(huán)境光顏?色?*?物體顏?色
    vec3 result = ambient * objectColor;
    ?l_FragColor = vec4(result, 1.0);
    }

    發(fā)射光的計(jì)算

    ? ? ? ? 發(fā)射顏色 = 物體反射材質(zhì)的顏色

    漫反射光的計(jì)算

    ? ??????漫反射顏?色?=?光源的漫反射顏?色?*?物體的漫發(fā)射材質(zhì)顏?色?* DiffuseFactor
    ? ??????DiffuseFactor = max(0,dot(N,L))

    ????????漫反射因子DiffuseFactor?是光線與頂點(diǎn)法線向量的點(diǎn)積

    漫反射


    ? ? ? ? 漫反射光計(jì)算代碼實(shí)現(xiàn)

    ? ? ? ? ? ? uniform vec3 lightColor;
    ? ? ? ? ? ? ?uniform vec3 lightPo;
    ? ? ? ? ? ? uniform vec3 objectColor;
    ? ? ? ? ? ? uniform vec3 viewPo;
    ? ? ? ? ? ? varying vec3 outNormal;
    ? ? ? ? ? ? //確保法線為單位向量
    ? ? ? ? ? ?vec3 norm = normalize(outNormal); //頂點(diǎn)指向光源單位向量
    ? ? ? ? ? ?vec3 lightDir = normalize(lightPo - FragPo); //得到兩向量的cos值小于0則為0
    ? ? ? ? ? float diff = max(dot(norm, lightDir),0.0); // 得到漫反射收的光源向量
    ? ? ? ? ? vec3 diffuse = diff * lightColor;
    ? ? ? ? ? vec3 result? = diffuse * ojbectColor;
    ? ? ? ? ? gl_FragColor = vec4(result,1.0);

    鏡面光計(jì)算


    鏡面光強(qiáng)度與視點(diǎn)位置相關(guān)

    N : 平?面法線
    ?I : 入射光線?
    H : 反射光線?
    E : 視線
    ? : 視點(diǎn)與反射光的夾角

    鏡面反射顏色?=?光源的鏡面光的顏色?*?物體的鏡面材質(zhì)顏色?* SpecularFactor
    SpecularFactor = power(max(0,dot(N,H)),shininess)

    H?:視線向量E?與 光線向量L?的半向量
    dot(N,H):H,N的點(diǎn)積幾何意義,平方線與法線夾角的cos值
    shiniess :??高光的反光度;

    鏡面光計(jì)算代碼實(shí)現(xiàn)

    //鏡面強(qiáng)度
    float specularStrength = 0.5;
    //頂點(diǎn)指向觀察點(diǎn)的單位向量
    vec3 viewDir = normalize(viewPo - FragPo);
    //求得光線在頂點(diǎn)的反射線(傳入光源指向頂點(diǎn)的向量)
    vec3 reflectDir = reflect(-lightDir ,outNormal);
    //?求得夾角cos值取256次冪 注意?pow(float,float)函數(shù)參數(shù)類型
    float spec = pow(max(dot(viewDir, reflectDir),0.0),256.0);
    vec3 specular = specularStrength * spec * lightColor;

    光照計(jì)算

    ? ??????光照顏色?=(環(huán)境顏色?+?漫反射顏色?+?鏡面反射顏色)*?衰減因?

    ? ? ??

    衰減因子

    衰減因子

    衰減因? = 1.0/(距離衰減常量?+?線性衰減常量?*?距離?+ 二次衰減常量?*?距離的平?)

    注意:環(huán)境光巫财,漫反射光和鏡面光的強(qiáng)度都會(huì)受距離的增大而衰減,只有發(fā)射光和全局環(huán)境光的強(qiáng)度不會(huì)受影響

    衰減因子代碼

    //距離衰減常量
    float constantPara = 1.0f;
    //線性衰減常量
    float linearPara = 0.09f;
    //二次衰減因?
    float quadraticPara = 0.032f;
    //距離
    float LFDistance = length(lightPo - FragPo);
    //衰減因?
    float lightWeakPara = 1.0/(constantPara + linearPara* LFDistance + quadraticPara (LFDistance*LFDistance));

    聚光因子

    聚光燈夾角cos值?= power(max(0,dot(單位光源位置阀蒂,單位光線向量)),聚光燈指數(shù));

    • 單位光線向量:從光源指向頂點(diǎn)的單位向量?
    • 聚光燈指數(shù):表示聚光燈的亮度程度
    • 公式解讀:單位光源位置 *?單位光線向量點(diǎn)積的聚光燈指數(shù)次?啄育。
    增加過渡計(jì)算
    聚光燈因? = clamp((外環(huán)的聚光燈角度cos值?-?當(dāng)前頂點(diǎn)的聚光燈角度cos值)/ (外環(huán)的聚光燈角度cos值-?內(nèi)環(huán)聚光燈的角度的cos值),0,1);

    聚光燈過度計(jì)算代碼實(shí)現(xiàn)

    //(?一些復(fù)雜的計(jì)算操作 應(yīng)該讓CPU做,提?高效率,不不變的量量也建議外部傳輸,避免 重復(fù)計(jì)算)
    //內(nèi)錐?角cos值
    float inCutOff = cos(radians(10.0f));?
    //外錐?角cos值
    float outCutOff = cos(radians(15.0f));?
    //聚光朝向
    vec3 spotDir = vec3(-1.2f,-1.0f,-2.0f);
    //光源指向物體的向量和聚光朝向的cos值
    float theta = dot(lightDir ,normalize(-spotDir));
    ?//內(nèi)外錐角cos差值
    float epsilon = inCutOff - outCutOff;
    //clamp(a,b,c);若b<a<c則函數(shù)返回值為a,若不是則返回最小值b酌心、最大值c
    // (theta - outCutOff)/epsilon 若theta的角度小于內(nèi)錐角 則其值>=1?若theta的角度大于外錐角 則其值<=0?這樣光線就在內(nèi)外錐角之間平滑變 化.
    float intensity = clamp((theta - outCutOff)/epsilon, 0.0,1.0);

    光照計(jì)算終極公式

    光照顏色?=?發(fā)射顏色?+?全局環(huán)境顏色?+ (環(huán)境顏色?+?漫反射顏色?+?鏡?反射顏色) *?聚光燈效果?*?衰減因?

    平面光計(jì)算代碼實(shí)現(xiàn)

    //環(huán)境因?
    float ambientStrength = 0.3;
    ?//鏡面強(qiáng)度
    float specularStrength = 2.0;
    ?//反射強(qiáng)度
    float reflectance = 256.0;
    //平行光方向
    vec3 paraLightDir = normalize(vec3(-0.2,-1.0,-0.3));
    //環(huán)境光
    vec3 ambient = ambientStrength * texture(Texture ,outTexCoord).rgb;
    //漫反射
    vec3 norm = normalize(outNormal);
    vec3 lightDir = normalize(lightPo - FragPo);?
    //當(dāng)前頂點(diǎn)至光源的的單位向量
    float diff = max(dot(norm ,paraLightDir),0.0);
    vec3 diffuse = diff * lightColor*texture(Texture ,outTexCoord).rgb;
    //鏡面反射
    vec3 viewDir = normalize(viewPo - FragPo);
    vec3 reflectDir = reflect(-paraLightDir ,outNormal);
    float spec = pow(max(dot(viewDir, reflectDir),0.0),reflectance);
    vec3 specular = specularStrength * spec * texture(specularTexture ,outTexCoord).rgb;
    //最終光照顏色
    vec3 res = ambient + diffuse + specular;
    FragColor = vec4(res,1.0);

    點(diǎn)光源計(jì)算代碼實(shí)現(xiàn)

    float ambientStrength = 0.3;//環(huán)境因子
    float specularStrength = 2.0;//鏡面強(qiáng)度
    float reflectance = 256.0;//反射強(qiáng)度
    float constantPara = 1.0f;//常量
    float linearPara = 0.09f;//線性部分因子
    float quadraticPara = 0.032f; //二次項(xiàng)部分因數(shù)
    //環(huán)境光
    vec3 ambient = ambientStrength * texture(Texture ,outTexCoord).rgb;
    //漫反射
    vec3 norm = normalize(outNormal);
    vec3 lightDir = normalize(lightPo - FragPo); //當(dāng)前頂點(diǎn)至光源的的單位向量
    //點(diǎn)光源
    float diff = max(dot(norm ,lightDir),0.0); //光源與法線夾?角
    vec3 diffuse = diff * lightColor*texture(Texture ,outTexCoord).rgb;
    //鏡面反射
    vec3 viewDir = normalize(viewPo - FragPo);
    vec3 reflectDir = reflect(-lightDir ,outNormal);
    float spec = pow(max(dot(viewDir, reflectDir),0.0),reflectance);
    vec3 specular = specularStrength * spec * texture(specularTexture ,outTexCoord).rgb;
    //光線衰弱
    float LFDistance = length(lightPo - FragPo);
    float lightWeakPara = 1.0/(constantPara + linearPara * LFDistance + quadraticPara * (LFDistance*LFDistance));
    vec3 res = (ambient + diffuse + specular)*lightWeakPara;?
    FragColor = vec4(res,1.0);

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
    • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挑豌,隨后出現(xiàn)的幾起案子安券,更是在濱河造成了極大的恐慌墩崩,老刑警劉巖,帶你破解...
      沈念sama閱讀 217,826評(píng)論 6 506
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件完疫,死亡現(xiàn)場離奇詭異,居然都是意外死亡债蓝,警方通過查閱死者的電腦和手機(jī)壳鹤,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 92,968評(píng)論 3 395
    • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饰迹,“玉大人芳誓,你說我怎么就攤上這事“⊙迹” “怎么了锹淌?”我有些...
      開封第一講書人閱讀 164,234評(píng)論 0 354
    • 文/不壞的土叔 我叫張陵,是天一觀的道長赠制。 經(jīng)常有香客問我赂摆,道長,這世上最難降的妖魔是什么钟些? 我笑而不...
      開封第一講書人閱讀 58,562評(píng)論 1 293
    • 正文 為了忘掉前任烟号,我火速辦了婚禮,結(jié)果婚禮上政恍,老公的妹妹穿的比我還像新娘汪拥。我一直安慰自己,他們只是感情好篙耗,可當(dāng)我...
      茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
    • 文/花漫 我一把揭開白布迫筑。 她就那樣靜靜地躺著,像睡著了一般宗弯。 火紅的嫁衣襯著肌膚如雪脯燃。 梳的紋絲不亂的頭發(fā)上,一...
      開封第一講書人閱讀 51,482評(píng)論 1 302
    • 那天蒙保,我揣著相機(jī)與錄音曲伊,去河邊找鬼。 笑死追他,一個(gè)胖子當(dāng)著我的面吹牛坟募,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邑狸,決...
      沈念sama閱讀 40,271評(píng)論 3 418
    • 文/蒼蘭香墨 我猛地睜開眼懈糯,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了单雾?” 一聲冷哼從身側(cè)響起赚哗,我...
      開封第一講書人閱讀 39,166評(píng)論 0 276
    • 序言:老撾萬榮一對(duì)情侶失蹤她紫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屿储,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贿讹,經(jīng)...
      沈念sama閱讀 45,608評(píng)論 1 314
    • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
    • 正文 我和宋清朗相戀三年够掠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了民褂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
    • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疯潭,死狀恐怖赊堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情竖哩,我是刑警寧澤哭廉,帶...
      沈念sama閱讀 35,644評(píng)論 5 346
    • 正文 年R本政府宣布,位于F島的核電站相叁,受9級(jí)特大地震影響遵绰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜增淹,卻給世界環(huán)境...
      茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
    • 文/蒙蒙 一街立、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧埠通,春花似錦赎离、人聲如沸。這莊子的主人今日做“春日...
      開封第一講書人閱讀 31,866評(píng)論 0 22
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舞蔽,卻和暖如春荣病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渗柿。 一陣腳步聲響...
      開封第一講書人閱讀 32,991評(píng)論 1 269
    • 我被黑心中介騙來泰國打工个盆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人朵栖。 一個(gè)月前我還...
      沈念sama閱讀 48,063評(píng)論 3 370
    • 正文 我出身青樓颊亮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陨溅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子终惑,可洞房花燭夜當(dāng)晚...
      茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

    推薦閱讀更多精彩內(nèi)容

    • 光照是OpenGL ES里很重要的一部分,下面我們來學(xué)習(xí)總結(jié)一下如何計(jì)算不同的光照效果门扇。 光照基礎(chǔ)1?環(huán)境光照2?...
      jakeXu閱讀 632評(píng)論 1 14
    • 現(xiàn)實(shí)世界的光照是極其復(fù)雜的雹有,而且會(huì)受到諸多因素的影響偿渡,這是以目前我們所擁有的處理能力無法模擬的。因此OpenGL的...
      zhongxiaoyue閱讀 722評(píng)論 0 1
    • 馮氏光照模型:主要結(jié)構(gòu)由3個(gè)元素組成:環(huán)境(Ambient)光照霸奕、漫反射(Diffuse)光照和鏡面(Specul...
      盾子閱讀 535評(píng)論 0 0
    • 光照基礎(chǔ) 1.環(huán)境光照(ambient) 2.漫反射光照(diffuse) 3.鏡面光照(specular) 光照...
      ChiLeung閱讀 529評(píng)論 0 0
    • 追氣球的少年們目前為止看起來似乎是首戰(zhàn)告捷,大獲全勝临梗。感恩周日涡扼,特別是下著淅淅瀝瀝的小雨的涼涼的周日(定基調(diào))稼跳,不...
      Carol124閱讀 334評(píng)論 0 1