Оператор if

Условное выполнение последовательности инструкций на основе вычисления условного выражения.

[Attribute] if ( Conditional ) { Statement Block; }

Параметры

Атрибут

Необязательный параметр, который управляет способом компиляции инструкции.

attribute Описание
ветвь Оцените только одну сторону оператора if в зависимости от заданного условия. Примечание: При использовании модели шейдера 2.x или модели шейдера 3.0 каждый раз при использовании динамического ветвления используются ресурсы. Таким образом, при чрезмерном использовании динамического ветвления при нацеливание на эти профили могут возникать ошибки компиляции.
преобразовать в плоский формат Оцените обе стороны оператора if и выберите между двумя полученными значениями.

Условного

Условное выражение. Выражение вычисляется, и если значение равно true, выполняется блок инструкций.

Блок инструкций

Одна или несколько инструкций HLSL.

Комментарии

Когда компилятор использует метод ветви для компиляции оператора if, он создает код, который будет оценивать только одну сторону оператора if в зависимости от заданного условия. Например, в операторе if:

[branch] if(x)
{
    x = sqrt(x);
}

Оператор if имеет неявный блок else, который эквивалентен x = x. Так как компилятору было предложено использовать метод branch с предыдущим атрибутом ветви, скомпилированный код будет вычислять x и выполнять только ту сторону, которая должна быть выполнена; Если значение x равно нулю, то оно будет выполнять сторону else , а если не равно нулю, то будет выполнена сторона then .

И наоборот, если используется плоский атрибут, то скомпилированный код будет оценивать обе стороны оператора if и выбирать между двумя результированными значениями, используя исходное значение x. Ниже приведен пример использования атрибута flatten:

[flatten] if(x)
{
    x = sqrt(x);
}

В некоторых случаях использование атрибутов ветви или сведений в плоскую структуру может привести к ошибке компиляции. Атрибут ветви может завершиться ошибкой, если любая из сторон оператора if содержит функцию градиента, например tex2D. Сбой атрибута flatten может завершиться ошибкой, если любая из сторон оператора if содержит оператор stream append или любой другой оператор, имеющий побочные эффекты.

Оператор if также может использовать необязательный блок else. Если выражение if имеет значение true, обрабатывается код в блоке операторов, связанном с оператором if. В противном случае обрабатывается блок инструкций, связанный с необязательным блоком else.

См. также раздел

Управление потоком