Войти
ПрограммированиеФорумГрафика

IF в шейдерах (3 стр)

Страницы: 1 2 3
#30
19:30, 19 апр. 2021

san
> Нужно добавить "мне".
В данном примере и мне проще их читать.

> Не пойму почему тебе продираться через горизонтальный код проще чем через
> вертикальный
Разбей на 2 строки, и сразу проще:

float k = clamp((IN.worldPos.y - _Y1) / (_Y2 - _Y1), 0, 1);
c = lerp(_Color1, _Color2, k);


#31
(Правка: 20 апр. 2021, 10:10) 21:10, 19 апр. 2021

Наверное так лучше. Потом через время легко будет вспомнить, что эта конструкция заменяет if.

float i,f;
 i = clamp((IN.worldPos.y - _Y1) / (_Y2 - _Y1), 0, 1);
 f = lerp(_Color1, _Color2, i);

#32
(Правка: 9:27) 9:25, 3 июня 2021

  float f;
  int i;
  if (f < 100) i = 0;
  else 
    if (f < 200) i= 1;
    else 
      if (f < 400) i = 2;
      else 
        if (f < 800) i = 3;
        else         
        i = 4;

Вместо "меньше" допустимо "меньше или равно".
Возможно избавится от if?

#33
(Правка: 10:29) 10:29, 3 июня 2021

MikeNew

float log2(float val) {return log(val) / log(2.0f);}
//...
i = int(log2(f / 100));

#34
11:02, 3 июня 2021

Suslik
> float log2(float val) {return log(val) / log(2.0f);}
> //...
> i = int(log2(f / 100));
https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-gr… ics-hlsl-log2
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/log2.xhtml

#35
12:42, 3 июня 2021

Suslik
> float log2(float val) {return log(val) / log(2.0f);}
> //...
> i = int(log2(f / 100));
Если f = 40    то  i = int(log2(40/100)) = int(-1.3219) = -1;  а надо 0.
Если f = 350  то  i = int(log2(350/100)) = int (1.8073) = 1;  а надо 2.

Что-то вообще никак.
Пробовал пофиксить и округлять выше с помощью ceil - все равно не то.

#36
12:44, 3 июня 2021

MikeNew

i = 1 + int(log2(f / 100));
#37
13:02, 3 июня 2021

Suslik
> float log2(float val) {return log(val) / log(2.0f);}
> //...
> i = int(log2(f / 100));
Фикс:

i = int(log2(ceil(f / 100)));  //  "почти" работает.

prowkan
> i = 1 + int(log2(f / 100));
Фикс:

i = 1 + int(log2(floor(f / 100)));

Предварительно, надо потестить еще будет.

#38
6:32, 4 июня 2021

А потом внезапно в код первого поста добавляется вызов нескольких функций в зависимости от условия и все, придётся переделывать под if, лол.

#39
11:58, 4 июня 2021

Коллеги, просто проверяйте ассемблер http://shader-playground.timjones.io/
Подобне if давно уже инлайнятся в compare-mov операции

#40
(Правка: 13:10) 13:05, 4 июня 2021

san
> Да ну? Неужели [lerp+clamp] "читать проще" чем [else if else if else if]?
Да. Первый вариант проще мысленно перевести в график зависимости.

ronniko
> Наверное так лучше. Потом через время легко будет вспомнить, что эта
> конструкция заменяет if.
Возможно, это различие между людьми, которые владеют математикой, и остальными - я считаю, что это if является костыльной формой clamp, а не наоборот.

std::cin
> А потом внезапно в код первого поста добавляется вызов нескольких функций в
> зависимости от условия и все, придётся переделывать под if, лол.
Не добавляется.

Страницы: 1 2 3
ПрограммированиеФорумГрафика