Coding — Глюк с рисованием тени при использовании OpenGL
Здравствуйте.
Сейчас я делаю вертикальный scroll-shooter (леталка-стрелялка), что-то похожее на Tyrian, Raptor, Raiden и т.п.
Пишу на с++ с использованием связки SDL+OpenGL
Столкнулся с одной проблемой...
Раньше я использовал для вывода спрайта затекстурированный полигон, каждый спрайт(его текстура) находиться в отдельных *.png файлах.
Эта процедура имеет примерно такой вид (процедура 1):
Код:
Захотелось использовать одну общую текстуру (с набором спрайтов). Спрайт получать закрашивая полигон задавая текстурные координаты, и процедура стала иметь вид (процедура 2):
Код:
В игре для летающих объектов хочется сделать тень, отбрасываемую ими на землю. Посоветовали использовать для этих целей буфер трафарета, вот примерно так это выглядит:
Код:
Если использовать для вывода трафарета level_draw процедуру 1, то тень рисуется как надо-только на трафарете, учитываются спрайты с "дырками" альфа канала (на дырках тени не должно быть), тени не смешиваются. НО мне хочется использовать для вывода level_draw процедуру 2, так проще. Если так сделать то начинаются появляться глюки-тени иногда мигают, пропадают на некоторое время или просто не рисуются. Я думаю что это из-за альфа теста и альфа функа , если их убрать тени будут рисоваться на всех спрайтах level_draw, включая "дыры" альфа канала.
Хочется вывода нормальных теней при использовании процедуры 2, как при использовании процедуры 1.
То есть, чтобы тени не смешивались, хотя бы не рисовались на "дырах". Как это исправить ?
вот, собсно сами глючные исходники для раскрытия всей картины:
http://narod.ru/disk/13246865000/light.tar.gz.html
тень от самолета на заднем фоне уровня иногда мигает или пропадает вовсе:( на космосе тени нет-так и должно быть.
Сейчас я делаю вертикальный scroll-shooter (леталка-стрелялка), что-то похожее на Tyrian, Raptor, Raiden и т.п.
Пишу на с++ с использованием связки SDL+OpenGL
Столкнулся с одной проблемой...
Раньше я использовал для вывода спрайта затекстурированный полигон, каждый спрайт(его текстура) находиться в отдельных *.png файлах.
Эта процедура имеет примерно такой вид (процедура 1):
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
//рисуем затекстурированый полигон |
Захотелось использовать одну общую текстуру (с набором спрайтов). Спрайт получать закрашивая полигон задавая текстурные координаты, и процедура стала иметь вид (процедура 2):
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
//рисуем затекстурированый полигон из общей текстуры |
В игре для летающих объектов хочется сделать тень, отбрасываемую ими на землю. Посоветовали использовать для этих целей буфер трафарета, вот примерно так это выглядит:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
Если использовать для вывода трафарета level_draw процедуру 1, то тень рисуется как надо-только на трафарете, учитываются спрайты с "дырками" альфа канала (на дырках тени не должно быть), тени не смешиваются. НО мне хочется использовать для вывода level_draw процедуру 2, так проще. Если так сделать то начинаются появляться глюки-тени иногда мигают, пропадают на некоторое время или просто не рисуются. Я думаю что это из-за альфа теста и альфа функа , если их убрать тени будут рисоваться на всех спрайтах level_draw, включая "дыры" альфа канала.
Хочется вывода нормальных теней при использовании процедуры 2, как при использовании процедуры 1.
То есть, чтобы тени не смешивались, хотя бы не рисовались на "дырах". Как это исправить ?
вот, собсно сами глючные исходники для раскрытия всей картины:
http://narod.ru/disk/13246865000/light.tar.gz.html
тень от самолета на заднем фоне уровня иногда мигает или пропадает вовсе:( на космосе тени нет-так и должно быть.