好久沒有更新部落格了。。。 最近一直在忙一些其他的事情= =。。 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遊戲開發手記之 龍書 第二版學習筆記 的平行版,也可以說是續集。說是平行版,因為這兩個部落格系列因為某種顯而易見的原因,內容是很平行的 而之所以說是續集,是因為前面那個系列可能就此坑掉了 前面那個系列是關於...