DirectX11 學習筆記(14) 點光源

2021-09-05 15:51:21 字數 2801 閱讀 4944

好久沒有更新部落格了。。。  最近一直在忙一些其他的事情= =。。  dx都快忘了

今天繼續更新!  

上次說到簡單光照,今天我們就學習乙個點光源

影響點光源的因素主要有:

範圍,位置,衰減

其中衰減用乙個二次方程來表達

attenuation = att0 + (att1 * d) + (att2 * d²)
att0  - 常量修飾符

由於此值未乘以任何值,因此稱為「常量修改器」,這意味著此值不會隨著從光源到畫素的距離的變化而變化。該值用於為光源範圍內的所有物體提供最小量的光。如果您要將此值設定為「1.0f」,那麼光源範圍內的所有內容都將具有全彩或全光。

att1  - 線性修改器

您可以看到此值乘以光源和畫素之間的距離,或乘以等式中的d。這使得該值成為「線性修改器」,這意味著隨著畫素和光源之間的距離增加,這將逐漸減少畫素獲得的光量。這可能是最現實的因素。

att2  - 指數修飾符

此值乘以d的平方,使該值為「指數修飾符」。使用此值可以使非常接近光源的物體獲得大量光線,但隨著它們移開,它們快速接收的光線會在很短的距離內減小,然後隨著距離越來越遠而逐漸減小。

lighttopixelvec = light.pos - input.worldpos;
之前我們已經學了如何把世界空間中的變數傳送到vs中,其實把燈光傳送到ps也是一樣的道理。

然後呼叫hlsl中的函式。然後把向量單位化

d = length(lighttopixelvec);

lighttopixelvec /= d;

計算光照強度,然後乘光照本身的顏色得到顏色。  最後除以衰減係數

howmuchlight = dot(lighttopixelvec, input.normal);

finalcolor += howmuchlight * diffuse * light.diffuse;

finalcolor /= light.att[0] + (light.att[1] * d) + (light.att[2] * (d*d));

struct light

xmfloat3 dir;

float pad1;

///**************new**************

xmfloat3 pos;

float range;

xmfloat3 att;

float pad2;

///**************new**************

xmfloat4 ambient;

xmfloat4 diffuse;

};

描述光照

light.pos = xmfloat3(0.0f, 0.0f, 0.0f);

light.range = 100.0f;

light.att = xmfloat3(0.0f, 0.2f, 0.0f);

light.ambient = xmfloat4(0.3f, 0.3f, 0.3f, 1.0f);

light.diffuse = xmfloat4(1.0f, 1.0f, 1.0f, 1.0f);

xmvector lightvector = xmvectorset( 0.0f, 0.0f, 0.0f, 0.0f );

lightvector = xmvector3transformcoord(lightvector,cube1world);

light.pos.x = xmvectorgetx(lightvector);

light.pos.y = xmvectorgety(lightvector);

light.pos.z = xmvectorgetz(lightvector);

我們這裡把光照位置設定為第乙個立方體的位置

在effect file中描述我們的結構體

struct light

;

vs 和ps如下

vs_output vs(float4 inpos : position, float2 intexcoord : texcoord, float3 normal : normal)

float4 ps(vs_output input) : sv_target

//make sure the values are between 1 and 0, and add the ambient

finalcolor = saturate(finalcolor + finalambient);

//return final color

return float4(finalcolor, diffuse.a);

}

在ps裡  我們先算了物體的自發光  物體的自發光就是他的漫反射的顏色*光照的自發光

如果不在光照範圍內,直接返回這個顏色。

否則的化計算他接收的多少光照:   光照強度*物體本身的漫反射顏色*光照本身的漫反射。(這裡不乘光照的自發光ambient是因為這個元素只與自身計算有關,並不對其他物體執行計算。  但是在計算finalambient的時候也用到了光照的ambient,我感覺有點不對。  等我仔細看一些相關的內容再來解釋~)

本節內容的**部分可以在我的github裡面找到!

遊戲開發路途遙遠,但我相信只要堅持,總能到達彼岸!

———————— 小明 2018.12.30 11.46

DirectX11渲染過程

網易作業deadline 要涼了555 對directx初始化完成後,就可以進行渲染了。struct vs input 輸入資料的格式 struct vs output 輸出資料的格式 vs output main vs input input 編譯之後生成cso檔案,使用readfiletoblo...

DirectX11學習筆記(不定期更新)

目錄 1 dx與hlsl的矩陣 2 建立常量緩衝區的尺寸需要按照16位元組對齊 dx的矩陣 directx xmmatrix 按照行主元優先儲存,而hlsl的矩陣預設按照列主元優先儲存。解決這個問題的方法有兩種 1 將directx的矩陣轉置 directx xmmatrix m matrix di...

DirectX 11遊戲程式設計學習筆記之1 開場白

本文由哈利 2024958085 qq.com 這是我之前的部落格系列 directx9.0c遊戲開發手記之 龍書 第二版學習筆記 的平行版,也可以說是續集。說是平行版,因為這兩個部落格系列因為某種顯而易見的原因,內容是很平行的 而之所以說是續集,是因為前面那個系列可能就此坑掉了 前面那個系列是關於...