我正在使用带有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) )。
答案 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可能会有一些聪明的方法让你为我做这件事我自己不知道