将16位无符号int数组转换为32位浮点数组

时间:2014-03-21 21:48:36

标签: c++ type-conversion directx-9

我正在使用带有64位渲染目标的directx 9 ...我需要读取渲染目标表面上的数据。每个颜色分量(a,r,g,b)用2个字节(或16比特×4 = 64)编码。如何将每个16位颜色分量转换为32位浮点变量?这是我尝试过的:

BYTE *pData = ( BYTE* )renderTargetData;

for( UINT y = 0; y < Height; ++y )
{

   for( UINT x = 0; x < width; ++x )
   {
       // declare 4component vector to hold 4 floats
       D3DXVECTOR4 vColor;

       // convert the pixel color from 16 to 32 bits
       D3DXFloat16To32Array( ( FLOAT* )&vColor, ( D3DXFLOAT16* )&pData[ y + 8 * x ], 4 );
    }
}

由于某种原因,这是不正确的...在转换后的一种情况下,一个像素的实际renderTargetData是(0,0,0,65535),我得到这个结果:(0,0,0,-131008.00) )。

1 个答案:

答案 0 :(得分:2)

通常,将整数v从范围[0..n]中的整数转换为浮动范围[0.0..1.0]是:

float f = v/(float)n;

所以,在你的情况下,一个循环:

vColor.x = (pData[ y + 4 * x ])/65535.0f; 
vColor.y = (pData[ y + 4 * x + 1 ])/65535.0f; 
// ... etc. 
如果我们将BYTE *pData = ( BYTE* )renderTargetData;更改为WORD *pData = ( WORD* )renderTargetData;

,则

应该有效

但DX可能会有一些聪明的方法让你为我做这件事我自己不知道