如何使用HLSL将四个无符号字节(0-255)编码为浮点数并再返回?

时间:2010-05-22 20:50:58

标签: optimization floating-point hlsl

我正面临一项任务,其中我的一个hlsl着色器需要每个像素进行多次纹理查找。我的2d纹理固定为256 * 256,因此在给定此约束的情况下,两个字节应足以处理任何给定的纹素。我的想法是在每个浮点数中放置两个xy坐标,当以Vector4格式图像打包时,在像素空间中给出八个xy坐标。然后使用这八个坐标对另一个纹理进行采样。

这样做的原因是为了节省图形内存并尝试优化处理时间,因为那时我不需要多次纹理查找。

顺便说一句:有没有人知道使用1次采样从4个浮点数编码/解码16个字节是否比使用未编码数据的4次采样慢?


编辑:这适用于着色器模型3

1 个答案:

答案 0 :(得分:1)

如果您定位SM 4.0-SM 5.0,可以使用Binary CastsBitwise operations

uint4 myUInt4 = asuint(myFloat4);

uint x0 = myUInt4.x & 0x000000FF; //extract two xy-coordinates (x0,y0), (x1,y1)
uint y0 = (myUInt4.x & 0x0000FF00) >> 8;
uint x1 = (myUInt4.x & 0x00FF0000) >> 16;
uint y1 = (myUInt4.x & 0xFF000000) >> 24;

//repeat operation for .y .z and .w coordinates

对于之前的Shader模型,我认为它可能更复杂,因为它取决于FP精度。