2016-06-13 2 views
1

Я пытаюсь использовать Unity и Xbox Kinect для создания игры/прототипа.декодирование 16-битное значение int, хранящееся в текстуре RGB565

Камера глубины на kinect возвращает байт [] из 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

Dont '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; 
Смежные вопросы