I am doing some animation jobs. I need to pack some pivots into UV and then my shader can read them.

I need to pack 4 float3 into a float4. Therefore, I need to pack each float3 into a float.

These 4 float3 are (model space position1, direction1, model space position2, direction2). I know how to handle the directions because they are normalized. I can use something like:

 #define f3_f(c) (dot(round((c) * 255), float3(65536, 256, 1)))
 #define f_f3(f) (frac((f) / float3(16777216, 65536, 256)))

But How can I pack these positions? I am using SM3.0 and I can't use bitwise operations

  • 2
    $\begingroup$ In general you cannot store $N$ bytes into $\frac{N}{3}$ bytes without some form of lossy compression. Depending on the different needs, assumptions, and constraints, entirely different compression methods may be adequate. $\endgroup$
    – lightxbulb
    Commented Dec 31, 2019 at 12:07
  • $\begingroup$ Unit directions can always be represented in two floats (longitude & latitude), and you could store them quantized as a pair of half-floats. Does one of your directions point toward the other position? If that's true, you could store one position as 3 half-floats, and the other position as a half-float distance. That would be a total of 8 half floats, or 1 float4. $\endgroup$
    – David
    Commented Jan 1, 2020 at 20:11
  • $\begingroup$ Are you sure you cannot add more attributes? you should have up to 16 vec4s worth of attribute space for the vertex shader input data. $\endgroup$ Commented Jan 3, 2020 at 10:55


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.