Я портирую настольное приложение OpenGL на GLES-2 (iOS специально). В настольной версии некоторые шейдеры GLSL полагались на операции с целыми битами, которых нет в GLES.Портирование рабочего GLSL-шейдера, использующего бит-операции для GLES
Эта функция была первоначально использована в пиксельный шейдер:
int reverseByte(int a)
{
int b = 0;
for (int i = 0; i < 8; i++)
{
b <<= 1;
b |= ((a & (1 << i)) >> i);
}
return b;
}
// ---- usage example: ----
// get inputs from somewhere, just some test values here...
int r = 255;
int g = 128;
int b = 20;
r = reverseByte(r);
g = reverseByte(g);
b = reverseByte(b);
/* produces:
r = 255
g = 1
b = 40
*/
// color would then be normalized to [0,1] range and further used...
Это изменяет порядок битов в байте. Это используется с цветами RGB в диапазоне [0,255]. В GLES не хватает целочисленных манипуляций с битами, поэтому вышеуказанная функция не компилируется. Я провел некоторое исследование, пытаясь найти замену для него, и нашел несколько других возможных способов реверсирования битов в here, но все полагаются на операции с битами целого числа.
Мой вопрос: есть ли способ добиться аналогичного или эквивалентного результата, используя операции с плавающей запятой и/или материалы, доступные в GLSL-ES?
Боковые ноты:
Я не могу предвычисления значения в CPU и передавать данные в качестве текстуры или любой другой, так как данные процедурно генерируется затенении.
Возможно, вы подумали, что я собираю данные в текстуру, загружаю их в ЦП, обрабатываю их, а затем обновляю текстуру с результатами. Ну, это на самом деле мое текущее решение, но производительность очень плохая из-за больших передач данных. Мне очень хотелось бы иметь возможность сделать это прямо в шейдере.
Вау, очень изящное решение, спасибо! – glampert