【发布时间】:2019-12-31 01:53:09
【问题描述】:
我正在做一些动画工作。我需要将一些枢轴打包到 UV 中,然后我的着色器可以读取它们。
我需要将 4 个 float3 打包成一个 float4。因此,我需要将每个float3打包成一个float。
这4个float3是(模型空间位置1,方向1,模型空间位置2,方向2)。我知道如何处理方向,因为它们是标准化的。我可以使用类似的东西:
#define f3_f(c) (dot(round((c) * 255), float3(65536, 256, 1)))
#define f_f3(f) (frac((f) / float3(16777216, 65536, 256)))
但是我该如何处理职位呢?我用的是SM3.0,不能按位运算。
【问题讨论】:
-
您有该职位的范围信息吗?还是一些精度要求?使用 10 位可用信息,您将无法获得很高的精度。
-
问题是我没有具体的范围,我想可能(-1000, 1000)。
-
你想如何将一个 float3 打包成一个浮动?还有你想如何将 4 个 float3 打包成一个 float4 ...对我来说毫无意义
-
您最终只会得到(最多)10 位的精度。您将需要其中 1 个位来表示负值。如果剩余 9 位作为完整单位值应用(即 LSB 表示
1;没有指数位),则最大值为 511。 -
仅使用 两个 位作为指数,您的值范围突然下降到最大值
7.96875(但可以以 ~0.004的增量表示大多数值....并且大于0.5)。
标签: unity3d graphics shader hlsl cg