2014-10-09 5 views
1

Я портирую настольное приложение 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?

Боковые ноты:

  1. Я не могу предвычисления значения в CPU и передавать данные в качестве текстуры или любой другой, так как данные процедурно генерируется затенении.

  2. Возможно, вы подумали, что я собираю данные в текстуру, загружаю их в ЦП, обрабатываю их, а затем обновляю текстуру с результатами. Ну, это на самом деле мое текущее решение, но производительность очень плохая из-за больших передач данных. Мне очень хотелось бы иметь возможность сделать это прямо в шейдере.

ответ

5

это усложнится, но это должно сделать трюк:

int b=0; 
for (int i = 0; i < 8; i++) 
{ 
    b *= 2; 
    b += mod(a, 2); 
    a /= 2; 
} 
+0

Вау, очень изящное решение, спасибо! – glampert

 Смежные вопросы

  • Нет связанных вопросов^_^