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

Converting 16 bit unsigned int array to 32 bit float array

本文关键字:数组 32位 转换 无符号 整型 16位      更新时间:2023-10-16

我使用directx 9与64位渲染目标…我需要读取渲染目标表面上的数据。每个颜色分量(a,r,g,b)用2字节(或16位x 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)。

一般来说,将整数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可能有一些聪明的方法来为你做这个我不知道因为我