народ подскажите почему в пиксельшейдере вот такой код медленнее чем PCFx16 (тоже в цикле)
for(int i = 0; i < 8-1; i++){ float4 LP = LightsPos[i]; float4 LD = LightsDif[i]; float3 Dir = LP.xyz - PosV.xyz; float llen = length( Dir); Dir = mul( Dir,tbnMatrix); float attenuation = saturate( 1.0/( LD.w * llen + LP.w * llen * llen)); Dir = normalize( Dir); difftemp = float4( max( dot( Normal, Dir),0)*LD.xyz*attenuation,1.0); // diffuse component halfv = normalize( Dir + ViewDir); specular += pow( max( 0,dot( Normal, halfv)),MaterialSpecular.w)*difftemp; diff += difftemp;
там в 2 раза больше оборотов + выборка из текстур а что тут не катит?
PCF срезает примерно 10 фпс а это аж 20 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Математика навороченная. Умножение на матрицу, две нормализации, pow в переменную степень...
PCF срезает примерно 10 фпс а это аж 20 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
20 фпс из сколько? Из 30 или из трёх тыщ?
И шейдер этот как рисуется? Со включенным blendFunc?
Mira
> for(int i = 0; i < 8-1; i++)
А так?
[unroll]
for(int i = 0; i < 7; i++)
g-cont
с 80 почти до 60 роняет это жестоко.
какая разница включен или нет blendFunc ? если я убираю этот кусок то работает быстрее
Misanthrope
компиллятор всеравно запишет 7
//не влияет
Mira
> компиллятор всеравно запишет 7
меня больше unroll интересует))
https://msdn.microsoft.com/en-us/library/bb313989(v=xnagamestudio.31).aspx
float value = 0;
[unroll(3)]
while( value <= 5 )
{
value ++;
}
Mira
> народ подскажите почему в пиксельшейдере вот такой код медленнее чем PCFx16 (тоже в цикле)
Наверное просто математика кушает больше, чем выборки, темболее которые наверняка хорошо в кеш попадают.
Оптимизируй математику, вынеси за цикл то, что не меняется.
Executor
По уму большинство этой байды должно считаться ещё в вертексном , но передать из вершин 8 ис я увы не могу(
Если у тебя правильно построенная матрица tbn, тогда нормализацию dir можно заменить на деление на его длину (она у тебя уже есть).
Это, насколько я понимаю, forward shading?
Sergio
Да просто надо 8 источников света вставить. В примерах матрица множится в вершинном и передают в фрагмент уже перемноженные в тексткоординатах. Ясно так много не передаш)
С дефферед боюсь вообще будет слайдшоу. Уже щас сделал тени и 8 ис и уже тормозит. Толи дх9 убог толи я чётко не так делаю)
Sergio
СПС попробую упростить...
Misanthrope
Пишут эта фишка для хбокса
Mira
> По уму большинство этой байды должно считаться ещё в вертексном , но передать
> из вершин 8 ис я увы не могу(
1) Попробуй передать 4 и сделай два дипа.
2) Попробуй заменить расчёт диффузного и спекулярного компонентов на выборку из 3D-текстуры (clamp, linear) вида
tex3D( dot(Normal, Dir), dot(Normal, halfv), MaterialSpecular.w );
это избавит от двух max и одного pow. При грамотном подборе размера текстуры это будет быстро и красиво.
Моласар
В 2 дипа это будет как раз чтото типа deffered , боюсь тут боттлнеком станет ещё и геометрия. Много поликов и размер вертекса большеват.
С текстурой попробую. Главное найти мануал как ещё сгенерировать корректно.
Тема в архиве.