首页 > 解决方案 > 将轴对齐的单位向量编码为单个浮点值

问题描述

我想将轴对齐的单位向量编码为单个浮点值。像这样:

0: vec3(0, 0 ,0)

1: vec3(1, 0, 0)

2: vec3(0, 1, 0)

3: vec3(0, 0, 1)

要根据表格将浮点数转换为向量,我可以编写一个简单的代码

in float axisIndex
...
vec3 axis = vec3(0.0, 0.0, 0.0);
if (axisIndex > 0.5) {
  axis = vec3(1.0, 0.0, 0.0);
}
if (axisIndex > 1.5) {
  axis = vec3(0.0, 1.0, 0.0);
}
if (axisIndex > 2.5) {
  axis = vec3(0.0, 0.0, 1.0);
}

但是,如果分支很慢。有没有一种快速的方法将浮点数转换为向量,而不使用 if 分支和外部缓冲区,只使用数学?

标签: openglglslwebgl

解决方案


如果您必须这样做,那么最好的方法是使用简单的数组索引:

in uint axisIndex;

const vec3[4] table = {
  vec3(0, 0 ,0), 
  vec3(1, 0, 0),
  vec3(0, 1, 0),
  vec3(0, 0, 1)
};

然后只需使用table[axisIndex]来获取值。您可以使用 为着色器提供整数值glVertexAttribIPointer。虽然您可以为您提供的类型使用无符号字节,但最好只使用无符号整数;OpenGL 实现不喜欢不是 4 字节对齐的顶点属性。

话虽如此,这确实是不必要的。您可以只传递 3 个标准化的有符号字节作为属性,而不是单个索引。它不会在您的顶点数据中占用更多空间(同样,实现不喜欢未对齐的属性),并且处理速度可能不会变慢。


推荐阅读