ПрограммированиеФорумГрафика

пиксельшейдер тормоз! [решено]

Страницы: 1 2 3 4 Следующая »
#0
21:20, 31 мая 2015

народ подскажите почему в пиксельшейдере вот такой код медленнее чем 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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#1
21:40, 31 мая 2015

Математика навороченная. Умножение на матрицу, две нормализации, pow в переменную степень...

#2
0:24, 1 июня 2015

PCF срезает примерно 10 фпс а это аж 20 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

20 фпс из сколько? Из 30 или из трёх тыщ?
И шейдер этот как рисуется? Со включенным blendFunc?

#3
0:51, 1 июня 2015

Mira
> for(int i = 0; i < 8-1; i++)
А так?
[unroll]
for(int i = 0; i < 7; i++)

#4
1:23, 1 июня 2015

g-cont
с 80 почти до 60 роняет это жестоко.
какая разница включен или нет blendFunc ? если я убираю этот кусок то работает быстрее

#5
1:24, 1 июня 2015

Misanthrope
компиллятор всеравно запишет 7
//не влияет

#6
1:27, 1 июня 2015

Mira
> компиллятор всеравно запишет 7
меня больше unroll интересует))
https://msdn.microsoft.com/en-us/library/bb313989(v=xnagamestudio.31).aspx

float value = 0;
[unroll(3)]
while( value <= 5 )
{
  value ++;
}

#7
1:52, 1 июня 2015

Mira
> народ подскажите почему в пиксельшейдере вот такой код медленнее чем PCFx16 (тоже в цикле)

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

#8
8:11, 1 июня 2015

Executor
По уму большинство этой байды должно считаться ещё в вертексном ,  но передать из вершин 8 ис я увы не могу(

#9
8:18, 1 июня 2015

Если у тебя правильно построенная матрица tbn, тогда нормализацию dir можно заменить на деление на его длину (она у тебя уже есть).
Это, насколько я понимаю, forward shading?

#10
8:33, 1 июня 2015

Sergio
Да просто надо 8 источников света вставить. В примерах матрица множится в вершинном и передают в фрагмент уже перемноженные в тексткоординатах. Ясно так много не передаш)

С дефферед боюсь вообще будет слайдшоу. Уже щас сделал тени и 8 ис и уже тормозит. Толи дх9 убог толи я чётко не так делаю)

#11
8:33, 1 июня 2015

Sergio
СПС попробую упростить...

#12
8:34, 1 июня 2015

Misanthrope
Пишут эта фишка для хбокса

#13
9:51, 1 июня 2015

Mira
> По уму большинство этой байды должно считаться ещё в вертексном ,  но передать
> из вершин 8 ис я увы не могу(
1) Попробуй передать 4 и сделай два дипа.
2) Попробуй заменить расчёт диффузного и спекулярного компонентов на выборку из 3D-текстуры (clamp, linear) вида
tex3D( dot(Normal, Dir), dot(Normal, halfv), MaterialSpecular.w );
это избавит от двух max и одного pow. При грамотном подборе размера текстуры это будет быстро и красиво.

#14
10:40, 1 июня 2015

Моласар
В 2 дипа это будет как раз чтото типа deffered , боюсь тут боттлнеком станет ещё и геометрия. Много поликов и размер вертекса большеват.

С текстурой попробую. Главное найти мануал как ещё сгенерировать корректно.

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.