Как сделать шейдер преломления

Post Reply
User avatar
NightRadio
Site Admin
Posts: 2837
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Как сделать шейдер преломления

Post by NightRadio » Tue May 27, 2008 1:21 pm

Любому шейдеру в Pixilang передаются следующие параметры:
PS_T - номер пикси-контейнера с текстурой;
PS_TX - текущая координата X на текстуре (Fixed point);
PS_TY - текущая координата Y на текстуре (Fixed point);
PS_TP - номер пикселя на текстуре;
PS_P - номер пикселя на экране.
PS_R - окончательный цвет точки

Соответственно, шейдер с такими параметрами выполняется для каждого пикселя рисуемой картинки (или треугольника).

Вот обсолютно прозрачный шейдер:
scr = 0 PS_R = scr[ PS_P ]

Теперь смотрим. Мы тут использовали параметр PS_P - это номер пикселя на экране, если обращаться к нему, как к массиву.
Нетрудно понять, что если написать вот так
scr = 0 PS_R = scr[ PS_P + 2 ]
то, мы будем получать тот экранный пиксель, который правее на 2. Соответственно, картинка, отрисованная этим шейдером хоть и будет по прежнему прозрачной, но начнет как бы преломлять окружающую среду (сдвигать на 2 пикселя)

Это простой пример преломления, без учета рельефа картинки.
А чтобы учесть рельеф, заменим размер сдвига (число 2) на вот такую штуку - get_red( PS_T[ PS_TP ] )
То есть, сдвиг пикселей будет зависеть от яркости красной составляющей картинки.

Результат:
SHADER:
scr = 0 PS_R = scr[ PS_P + get_red( PS_T[ PS_TP ] ) ]
ret

Чтобы включить такой шейдер, пишем:
pixel_shader( SHADER )

Post Reply