2013-10-14 1 views
0

Я хочу иметь isequals (a, b) сравнения с использованием графической арифметики на 2 целых числах (я не могу использовать логический оператор if as мне нужна линейная логика), чтобы:Запись функции «Сравнить - Равно» в HLSL/CG, т. Е. Isequals (a, b)

возврата 1, если а = Ь
возврата 0, если а = Ь

Например, я могу написать:

1-saturate(distance(a,b)); // to return 1 if a = b. 

и

1-step(abs(a-b)); 

есть ли более быстрый способ сделать это в cg maths?

+1

Не могли бы вы объяснить, почему вы не можете просто проверить 'a == b'? Пожалуйста, поторопитесь, моя голова вот-вот взорвется. – thokra

+0

, потому что я делаю селектор для 640 возможных комбинаций математических функций, ... используя if (a == b) в шейдерной модели 3, он будет разворачивать компиляцию 640 комбинаций примерно в 64000 математических инструкций. если построить линейный селектор, который делит все остальные возможности на ноль, возможно, он более эффективен на sm3. и я должен ждать неделю, чтобы иметь графическую карту dx11. –

+0

т. Е. 10 x 10 x 10 выборок, используя if, составляет 1000 комбинаций, а использование умножения на ноль - это 1 длинная математическая функция, где 27 из 30 частей этой функции не выбраны и делятся на ноль. –

ответ

2
float result = (a == b); // Works in HLSL... 

Что заставляет вас думать == Не то, что вы хотите?

+0

Спасибо, что звучит здорово! я попробую это. –

1

Как насчет sat (abs (a-b) * FLOAT_MAX)? abs и sat должны быть свободными от арифметики. Это может сломаться в зависимости от реализации, если a и b очень близки. Если вам нужно инвертировать, вы всегда можете сидеть (1-x).

+0

Спасибо, что здорово! Мне хотелось бы понять вычислительную стоимость различных инструкций в hlsl, это просто аналогичное отношение к x86, кроме как быстрее? –

+1

http://www.humus.name/index.php?page=Articles&ID=6 может немного помочь! – starmole

+0

очень полезная презентация, спасибо! –