D3DTOP_DOTPRODUCT3的计算公式

来源:互联网 发布:mycat mysql 编辑:程序博客网 时间:2024/06/10 06:20

    前段时间在使用DirectX进行texture-blending操作时,发现D3DTOP_DOTPRODUCT3操作描述的比较粗略,在使用的时候与预计的结果相差十分大。于是把自己试验的结果记录一下。

当时在使用D3DTOP_DOTPRODUCT3操作时,在DirectX文档查询了它的计算公式:

SRGBA = (Arg1R  ×Arg2R + Arg1G ×Arg2Arg1B ×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_DOTPRODUCT3COLOROP操作时,我们可以自己把这个计算放在一个纹理里,然后再使用D3DTOP_SELECTARG1D3DTSS_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)

原创粉丝点击