Кодировать выровненный по оси единичный вектор в одном значении с плавающей запятой - PullRequest
1 голос
/ 25 апреля 2019

Я хочу закодировать выровненный по оси единичный вектор в одном значении с плавающей запятой.Например:

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);
}

Однако, если ветвимедленныеЕсть ли быстрый способ преобразования числа с плавающей точкой в ​​вектор без использования ветвей и внешних буферов, просто с использованием математики?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Если вам нужно так поступить, то лучше всего использовать простой индекс массива:

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. Хотя вы можете использовать неподписанный байт для типа, который вы предоставляете, лучше просто перейти к неподписанному int; Реализациям OpenGL не нравятся атрибуты вершин, которые не выровнены по 4 байта.

Как говорится, это действительно не нужно. Вы можете просто передать 3 нормализованных, подписанных байтов в качестве атрибута, а не один индекс. Это не займет больше места в ваших данных вершин (поскольку опять же реализации не любят смещенные атрибуты) и, вероятно, не будет медленнее обрабатывать.

1 голос
/ 25 апреля 2019

Быстрый способ будет

axis = vec3(float(axisIndex == 1.0), float(axisIndex == 2.0), float(axisIndex == 3.0))

Обратите внимание, что axisIndex может быть uint, а не float, и в этом случае вам нужно передать только 1 байт на вершину в графический процессор, если выпередать как GL_UNSIGNED_BYTE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...