opengl - 将轴对齐的单位向量编码为单个浮点值
问题描述
我想将轴对齐的单位向量编码为单个浮点值。像这样:
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 分支和外部缓冲区,只使用数学?
解决方案
如果您必须这样做,那么最好的方法是使用简单的数组索引:
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 个标准化的有符号字节作为属性,而不是单个索引。它不会在您的顶点数据中占用更多空间(同样,实现不喜欢未对齐的属性),并且处理速度可能不会变慢。
推荐阅读
- android - RecycleViewerAdapter 未完美显示 admob 插页式广告
- c - 在 C 中使用多个逻辑运算符时的意外短路评估
- python - 如何修复树莓派中的 IOError?
- python - 从 GeoDataFrame.crs 结果中提取 EPSG 代码
- r - R,情节一直出现在左下角而不是居中
- r - 根据两列删除重复项,在第三列保留一个具有较大值的列,同时保持所有列不变
- python - 从指定列值包含 null 的数据框中删除整行
- json - 如何序列化 json REST 导出视图
- spring-boot - 设置 Intellij IDEA JPA Console 命名策略
- javascript - 如何在运行脚本之前提交在活动单元格中所做的更改?(谷歌表格/谷歌应用脚本)