Эмуляция семантики VFACE в шейдере PS_2_0

Я немного дорабатываю некоторые из наших шейдеров HLSL, пытаясь заставить их работать в SM2.0. Мне почти удалось, но один из наших шейдеров принимает параметр:

float alignment : VFACE

Насколько я понимаю из MSDN, это автоматически вычисляемая переменная на случай, если она мне понадобится, но она не поддерживается в SM2.0... Итак, как я могу это воспроизвести? Я не программист шейдеров, поэтому любой (псевдо) код был бы действительно полезен. Я понимаю, что VFACE делает, но не понимаю, как я могу вычислить это самостоятельно в пиксельном шейдере или в VS и передать в PS. Вычисление его на пиксель звучит дорого, поэтому, может быть, кто-нибудь может показать скелет, чтобы вычислить его в VS и использовать его в PS?


person Mr. Boy    schedule 11.02.2011    source источник


Ответы (1)


Вы не можете. Потому что VFACE означает ориентацию треугольника (сзади или спереди), а стадии VS или PS не имеют доступа ко всему примитиву (как в стадии SM4/5 GS).

Единственный способ — визуализировать вашу геометрию за два прохода (один с отсечением задней грани, другой — с отсечением передней грани) и передать постоянное значение шейдеру, соответствующему значению VFACE.

person Stringer    schedule 11.02.2011
comment
Разве VS не получает нормаль к лицу треугольника и не имеет доступа к положению/вектору камеры? Я понятия не имею, как он может получить к ним доступ, или даже если VS может передавать значения в PS в любом случае? - person Mr. Boy; 11.02.2011
comment
Конечно, VS получает нормаль к лицу и также может получить доступ к вектору прицела (если вы передадите его VS). VS также может передавать значения PS. Но это не даст вам VFACE. По крайней мере, не совсем потому, что есть некоторые угловые случаи, когда две нормали треугольника будут обнаружены как обращенные вперед, а последняя - обращенная назад (или две как обращенные назад и одна как обращенные вперед). Это приводит к очень неприятным артефактам (я думаю, вы используете VFACE для двухстороннего освещения). Это связано с интерполяцией атрибутов в растеризаторе. Единственный способ сделать это правильно - использовать два прохода, как я указал в своем ответе. - person Stringer; 11.02.2011
comment
Нормаль face идентична для каждой вершины треугольника, я думаю, вы хотели сказать, что VS может получить доступ к нормалям vertex или интерполированным нормалям граней ? Это не для освещения, но ваша точка артефакта остается в силе... однако, возможно, стоит попробовать. - person Mr. Boy; 11.02.2011
comment
Точно, я имею в виду, что VS может получить доступ к нормалям вершин (нормаль, хранящаяся в VB). Только PS может получить доступ к интерполированным нормалям или любым другим примитивным интерполированным атрибутам, которые VS передает PS. - person Stringer; 12.02.2011