Двусторонние полигоны с задней стороны освещаются также как и с передней, что не есть хорошо. Можно-ли в пиксельном шейдере узнать какую сторону полигона мы рисуем в данный момент? Использую HLSL
зы. мне почему-то кажется, что гдето я видел или слышал, что есть переменная, которая в зависимости от того, задняя или передняя сторона принимает значения 1 или -1.... но может мне это и приснилось, в хелпе не нашел =(((
Нормали тебе в руки ) на обратной стороне нормали отвернты от камеры
Death_Dantist
> Нормали тебе в руки ) на обратной стороне нормали отвернты от камеры
ПОЛИНОГ ДВУСТОРОННИЙ!!!! Скажем так - 3 вершины - плоскость. У каждой вершины одна нормаль, и все они направлены вперед. С нормалями то понятно, но в этом случае нужно дублировать данный полигон
Kloun
vFace
ps30
Face Register
The face register (vFace) is new for this model. This is a floating point scalar register that will eventually contain the primitive area. In ps_3_0, however, only the sign of this register is valid. Hence, if the value is less than zero (the sign bit is set negative) the primitive is the back face (the area is negative, counterclockwise). Therefore, in ps_3_0 it only makes sense to compare this register against 0 (> 0 or < 0). Inside the pixel shader, the application can make a decision as to which lighting technique to use. Two-sided lighting can be achieved this way. This register requires a declaration, so undeclared usage will be flagged as an error. For lines and point primitives, this register is undefined. The face register can only be used as condition with the following instructions: setp_comp - ps, if_comp, or break_comp.
Я тупо дублирую полигоны и нет никакого геморроя с двухсторонними.
Kloun
Думаю нужны два прохода: CCW и CW с инвертированием нормалей в шейдере.
XIRMAC
IronNick
хм... спасибо... жалко конечно, я надеялся, что есть элегантное решение..... мне чет не до дублирования полигонов, а проходы увеличивать накладно - итак 1к дипов уже.... проще моделера заставить сделать без двусторонних =))))
innuendo
> vFace
> ps30
Спасибо!!!!!!!! Уррряяя!!! то что нужно!!!! Яж говорил видел такю штуку, просто искал в списке функций =(((( благодарю!!!!
Я не понял - что не так с нормалями? Зачем vFace?
Смотриш тот же полигон с тремя вершинами и его тремя нормалями, как нормали ориентированнъ к камере.
Да, ето накладъвает ограничения на нормали, ибо если они сильно отличаются от нормали к плоскости полигона, могут полезть баги, но там ничего сериозного нет.
Т.е.
- нормаль всегда должна поворачиватся к свету
- повернув нормаль к свету, смотрим угол между ней и view и считаем отражение или соответно переломление лайтинга (если ето полупрозранъй материал).
Z
> как нормали ориентированнъ к камере.
а причем тут камера? нужно допустим просто диффуз рассчитать.... dot(N, lit).... если я "поверну нормаль к свету", то освещение будет не просто некорректным а вообще непонятно каким... либо ты не понял в чем проблема, либо ты какуюто охинею написал...
Z
> Зачем vFace?
ok. А для чего по-твоему vFace придумали ?
Kloun
>>dot(N, lit)
Если прозрачнъй материал - важна нормаль к свету, если нет - к камере. Опять непонятно?
innuendo
> ok. А для чего по-твоему vFace придумали
Если сильно low-poly с раскривленнъми нормалями, тогда для two-sided лайтинга именно оно.
Z
А ты много видел примеров чтобы specular или diffuse считалься для backFace ?
Z
> Если сильно low-poly
кстати лоуполи =)). да и вообще частоли в играх хай-поли юзают? но нормали не раскривленные - нормальные.
Z
> Если прозрачнъй материал - важна нормаль к свету, если нет - к камере. Опять
> непонятно?
конечно непонятно. нужно рассчитать диффузное освещение (для непрозрачного объекта)! от положения камеры оно не зависит! (спекуляр тож нужен, но ща не о нем речь) . Сам подумай - на столе стоит коробка - одна сторона её освещена из окна - другая соответсвенно темная, третья средней яркости. так вот как ты не крутись вокруг этой коробки, степень ее освещенности менятся не будет!!!! если коробка металлическая, и на ней блики от солнца, то тогда они будут менятся в зависимости от точки обзора....
или диффуз не рассчитывается по формуле dot(Normal, LightDirection) ????
а вот если материал прозрачный - то это ничего не меняет.
и вообще что значит "важна нормаль". она либо нужна либо нет. понятие важна или нет это из другой оперы. И что значит "нормаль к свету", знаю "нормаль к полигону", "направление на источник света или направление источника света", а вот "нормаль к свету" или "нормаль к камере" вовсе непонятные субстанции
innuendo
> А ты много видел примеров чтобы specular или diffuse считалься для backFace ?
вот у меня кустики всякие, которые плейнами сделаны ... понимаю, что не true-подход, но до исправления этого момента еще не добрался, нужно чтобы хотябы этот подход работал нормально.
Тема в архиве.