2016-06-13 11 views
1

Ich versuche, Unity und die Xbox Kinect verwenden, um ein Spiel/Prototyp zu erstellen.Dekodierung 16 Bit Int-Wert in RGB565 Textur

Die Tiefenkamera am Kinect gibt ein Byte [] von 16bit Uint-Werten zurück. Ich erstelle gerade ein Unity Texture2D-Objekt und spezifiziere das Format als RGB565 und befülle es dann mit der LoadRawTextureData-Funktion. Dies funktioniert einwandfrei und in der Unity-Umgebung kann ich zur Laufzeit sehen, welche Textur erstellt und aktualisiert wird.

Wenn ich jedoch die Textur im Shader sample, bin ich mir wirklich nicht sicher, wie ich den kodierten Wert zurück in die ursprüngliche Tiefe Int decodiere. Ich habe einige Dinge ausprobiert, aber leider kein Glück, ich hatte gehofft, dass mir jemand in die richtige Richtung zeigen könnte.

 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; 
     } 

Jede Hilfe massiv geschätzt.

+0

Ist die Textur R16 Format nicht auf Ihrer Plattform unterstützt? – Quinchilion

+0

Ich glaube, es ist - ich habe es tatsächlich zuerst versucht, da ich angenommen habe, dass es einfacher wäre. Wie ich weiß, wären das 16 Bit alle im roten Kanal? Als ich dann den Sampler auf die Textur anwandte, schien es nur Daten im Alpha-Kanal zu geben - ich muss etwas seltsames gemacht haben, denke ich. –

+0

Dont 'Sample' (oder' tex2D') der codierte Wert, es sei denn, Sie tun Nearest-Neighbor-Sampling. Der interpolierte Wert ist bedeutungslos. – MooseBoys

Antwort

0

bin ich nicht sicher, ob HLSL und Ihre Zielplattform Unterstützung Bitoperatoren (seems to be true), aber wenn es eine mögliche Lösung hier ist:

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