+1 цикл по сравнению с чем? Есть ли у вас другой вариант работы, который представляет собой только одну инструкцию и не требует дополнительных накладных расходов?
Ни один язык ассемблера шейдеров, который я видел, не может выполнять отрицание для каждого компонента. То, что вы описали, - это два swizzled mov
s (один из которых с префиксом отрицания), например
MOV result.position.xz, -vertex.position.yyww;
MOV result.position.yw, vertex.position.xxzz;
Вы можете сократить его до одной инструкции, используя что-то вроде vec4 n = vec4(dir.yxwz) * vec4(-1.0, 1.0, -1.0, 1.0)
. Это было бы так:
PARAM c[1] = { { -1, 1 } };
MUL result.position, vertex.position.yxwz, c[0].xyxy;
(в обоих случаях я использовал result.position
и vertex.position
из вершинной программы ARB просто в качестве примера).
Но он использует дополнительный постоянный регистр, так что это не обязательно лучше.
Конечно, обе версии можно было бы завернуть в макрос.
обновить
Теперь я вижу, что вы хотели сделать. Что-то, что генерирует код вроде (для последней версии AMD):
0 x: DOT4 R0.x, -R0.y, R1.x
y: DOT4 ____, R0.x, R1.y
z: DOT4 ____, -R0.w, R1.z
w: DOT4 ____, R0.z, R1.w
Вместо этого вы видите дополнительные MOV. Однако это не похоже на корректный код (я не думаю, что DOT может принимать аргументы с частичным отрицанием. Не могу сказать больше, не прочитав внимательно руководство по эксплуатации), поэтому компилятор добавляет дополнительный MOV (что не обязательно приводит к дополнительному циклу). , кстати - зависит от других инструкций рядом).
person
keltar
schedule
31.03.2014