2016-06-13 12 views
1

ゲームとプロトタイプを作成するためにUnityとXbox Kinectを使用しようとしています。RGB565テクスチャに格納された16ビット整数値を

キネクトの深度カメラは、16ビットのuint値のバイト[]を返します。 私は現在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

ご使用のプラットフォームでサポートされていないR16テクスチャフォーマットですか? – Quinchilion

+0

私はそれが信じている - 私はそれがより簡単になると思ったので、私は実際にそれを最初に試しました。私はそれが赤いチャネルのすべての16ビットであることを理解している?私がサンプラーをテクスチャに適用すると、アルファチャンネルにデータがあるように見えました - 私は変わったことをしているに違いないと思います。 –

+0

最近隣のサンプリングをしていない限り、エンコードされた値を 'Sample'(または' tex2D')しません。補間された値は無意味です。 – MooseBoys

答えて

0

私はHLSLとターゲットプラットフォーム・サポート・ビット演算子(seems to be true)かどうかわからないんだけど、ここにそこにいる場合に可能なソリューションです:

uint depth = (uint) enc.r * 31 << 11 | 
      (uint) enc.g * 63 << 5 | 
      (uint) enc.b * 31; 
関連する問題