解码存储在RGB565纹理中的16位int值

时间:2016-06-13 16:04:21

标签: unity3d bit-manipulation shader hlsl

我正在尝试使用Unity和Xbox Kinect来创建游戏/原型。

kinect上的深度相机返回16位uint值的byte []。 我目前正在创建一个Unity Texture2D对象,并将格式指定为RGB565,然后使用LoadRawTextureData函数填充它。这很好,在Unity环境中,我可以在运行时看到正在制作和更新的纹理。

然而,当我在着色器中对纹理进行采样时,我真的不确定如何将编码值解码回原始深度int。我尝试了很多事情,但遗憾的是没有运气,我希望有人能指出我正确的方向。

        float decodeFloatRGB565(float4 enc) {
             //... decode value ...     
        }

        // The vertex shader - handles the position of the vertex 
        v2f vert(appdata v) {
            v2f o;
            o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.uv;

            float4 depthRGBA = tex2Dlod(_DepthTex, float4(v.uv,0.0,0.0));
            float val = decodeFloatRGB565(depthRGBA);

            //...scale to value between 0 and 255...
            //...scale to value between 0 and 1...

            o.color = float4(val,val,val,0.0);

            return o;
        }

        // The fragment shader - handles the color of vertex
        fixed4 frag (v2f i) : SV_Target { 
            return i.color; 
        }

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:0)

我不确定HLSL和您的目标平台是否支持按位运算符(seems to be true),但如果这里有可能的解决方案:

uint depth = (uint) enc.r * 31 << 11 | 
             (uint) enc.g * 63 << 5 |
             (uint) enc.b * 31;