我正在尝试使用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;
}
任何帮助都非常感激。
答案 0 :(得分:0)
我不确定HLSL和您的目标平台是否支持按位运算符(seems to be true),但如果这里有可能的解决方案:
uint depth = (uint) enc.r * 31 << 11 |
(uint) enc.g * 63 << 5 |
(uint) enc.b * 31;