D3DTOP_DOTPRODUCT3的计算公式
?? ?前段時間在使用DirectX進行texture-blending操作時,發現D3DTOP_DOTPRODUCT3操作描述的比較粗略,在使用的時候與預計的結果相差十分大。于是把自己試驗的結果記錄一下。
當時在使用D3DTOP_DOTPRODUCT3操作時,在DirectX文檔查詢了它的計算公式:
SRGBA?=?(Arg1R??×Arg2R?+?Arg1G?×Arg2G?+?Arg1B?×Arg2B?)
但是發現如果按照公式去計算,根本達不到想要的效果。在文檔的第一句說明“Modulate?the?components?of?each?argument?as?signed?components”也不知道DX是怎么調整的。相關的資料也沒有怎么查詢到。后來在一個偶然的機會給我看到一段代碼:
| D3DXVECTOR3?vNormal; D3DXVec3Cross(?&vNormal,?&v10,?&v01?); D3DXVec3Normalize(?&vNormal,?&vNormal?); DWORD?rR?=?(DWORD)(127.0f?*?vNormal.x?+?128); DWORD?rG?=?(DWORD)(127.0f?*?vNormal.y?+?128); DWORD?rB?=?(DWORD)(127.0f?*?vNormal.z?+?128); |
于是猜想“Modulate?the?components?of?each?argument?as?signed?components”應該是減去128然后再除以127,但是怎樣才能證實自己的想法呢?其實,在使用D3DTOP_DOTPRODUCT3的COLOROP操作時,我們可以自己把這個計算放在一個紋理里,然后再使用D3DTOP_SELECTARG1,D3DTSS_COLORARG1指向D3DTA_TEXTURE,如果兩次計算出來的結果是一樣的,那么就說明了這個公式基本上是一致的。
最后得出的結果是:?
SRGBA?=?((Arg1R?-?128)/127.0f?×(Arg2R?-?128)/127.0f?+?
????????(Arg1G?-?128)/127.0f?×(Arg2G?-?128)/127.0f?+
???????(Arg1B?-?128)/127.0f?×(Arg2B?-?128)/127.0f)
總結
以上是生活随笔為你收集整理的D3DTOP_DOTPRODUCT3的计算公式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 淘宝/天猫按图搜索商品API接口,以图搜
- 下一篇: Cartopy 0.20 最新功能 ——