Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: проблемы с рисованием тени при использовании OpenGL  (Прочитано 1947 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн NeonLight_Child

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
Сейчас я делаю скрул шутер-леталка сверху, на подобии Tyrian, Raptor, Raiden и т.п. Пишу на с++ с использованием SDL+OpenGL

Я использовал для вывода спрайта затекстурированный полигон, каждый спрайт(его текстура) находиться в отдельных *.png файлах.
Эта процедура имеет примерно такой вид (процедура 1):

//рисуем затекстурированый полигон
void DrawTXT (float x,
 float y,
 float dX,
 float dY,
 float delta,
 int center)
{
glLoadIdentity();
glTranslatef(x,y,0);
glRotatef(delta,0,0,-1);
if (center==1) {glTranslatef(-dX/2,-dY/2,0);}//смещаем по центре

glBegin( GL_QUADS );
// Верхний левый угол
glTexCoord2i(0,0);  glVertex2f( 0, 0 );
//Нижний левый угол
glTexCoord2i( 0, 1 );  glVertex2f( 0, dY );
//Нижний правый угол
glTexCoord2i( 1, 1 );  glVertex2f( dX, dY );
//Верхний правый угол
glTexCoord2i( 1, 0 );  glVertex2f( dX, 0 );
glEnd();
glLoadIdentity();
}
Захотелось использовать одну общую текстуру (с набором спрайтов). Спрайт получать закрашивая полигон задавая текстурные координаты, и процедура стала иметь вид (процедура 2):

//рисуем затекстурированый полигон из общей текстуры
void _DrawTXT (float W,//размеры всей текстуры
 float H,
 float t_x,//координаты верхнего левого угла в текстуре
 float t_y,
 float t_dx,//размеры куска текстуры
 float t_dy,

 float x,
 float y,
 float dX,
 float dY,
 float delta,//угол поворота
 int center)
{
glLoadIdentity();
glTranslatef(x,y,0);
glRotatef(delta,0,0,-1);
if (center==1) {glTranslatef(-dX/2,-dY/2,0);}//смещаем по центре

glBegin( GL_QUADS );
// Верхний левый угол
glTexCoord2f((t_x/W),(t_y/H));  glVertex2f( 0, 0 );
//Нижний левый угол
glTexCoord2f((t_x/W),((t_y+t_dy)/H));  glVertex2f( 0, dY );
//Нижний правый угол
glTexCoord2f(((t_x+t_dx)/W),((t_y+t_dy)/H));  glVertex2f( dX, dY );
//Верхний правый угол
glTexCoord2f(((t_x+t_dx)/W), (t_y/H) );  glVertex2f( dX, 0 );
glEnd();

  glLoadIdentity();

}

В игре для летающих объектов хочется сделать тень, отбрасываемую ими на  землю. Посоветовали использовать для этих целей буфер трафарета, вот примерно так это выглядит:

//цвета теней не смешиваються!!! работает с глюками при выводе уровня из единой текстуры
 glEnable(GL_STENCIL_TEST);//включаем трафарет
 glStencilFunc(GL_ALWAYS, 1, 255);//в том месте где рисуется трафарет значение буфера заменяем на 1
 glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
 glEnable(GL_ALPHA_TEST);  //надо отсечь рисования прозрачных пикселей уровня
 glAlphaFunc(GL_GREATER,0.5f); //выводим только те пиксели уровня у которых alpha > 0.5f
level_draw();//уровень является трафаретом-только на нем видна тень
 glStencilFunc(GL_EQUAL, 1, 255);// тень будет рисоваться только в тех местах,где значение в буфере 1
 glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
 glAlphaFunc(GL_GREATER,0.45f); //выводим только те пиксели тени у которых alpha > 0.45f
player_shadow_draw();
 glDisable(GL_ALPHA_TEST);
 glDisable(GL_STENCIL_TEST);//отключаем трафарет

Если использовать для вывода трафарета level_draw процедуру 1, то тень рисуется как надо-только на трафарете, учитываются спрайты с "дырками" альфа канала (на дырках тени не должно быть), тени не смешиваются. НО мне хочется использовать для вывода level_draw процедуру 2, так проще. Если так сделать то начинаются появлятся глюки-тени иногда мигают, пропадают на некоторое время или просто не рисуются. Я думаю что это из-за альфа теста и альфа функа , если их убрать тени будут рисоваться на всех спрайтах level_draw, включая "дыры" альфа канала.

Хочется вывода нормальных теней при использовании процедуры 2, как при использовании процедуры 1. То есть, чтобы тени не смешивались, хотя бы не рисовались на "дырах". Как это исправить ?

ЗЫ:я не очень хорошо  знаю OpenGL(
« Последнее редактирование: 17 Сентября 2009, 21:05:35 от NeonLight_Child »

Оффлайн duhan

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
сколько раз пытался освоить хотя-б директ 3д...не говоря уже об опенгл ))) досихпор не смог ничего толкового понять ))
это я к тому что вообще его не знаю ))
посему вопрос...текстурку, конечно, удобнее двигать....но вот стоит-ли для каждого объекта грузить большую текстуру? вроде как лишняя загрузка памяти ))

кстати....а почему текстуры? может, стоит задуматься о 3Д? говорят, в 3д проще делать, чем над спрайтами извращаться )))

Оффлайн NeonLight_Child

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
просто мне нравится 2д)
уже почти все понятно как с ним работать, осталась только всякая мелочь вроде этой:(
кстати вот можно на сам глючный исходник взглянуть:
http://narod.ru/disk/13246865000/light.tar.gz.html

тень от самолета на заднем фоне уровня иногда мигает или пропадает вовсе:( на космосе тени нет-так и должно быть.

Оффлайн duhan

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
вот чесслово - ни разу не пытался под Linuxом писать на чём-то кроме пхп )) так что я не знаю как его запустить =\

насчёт 3д...имхо, он проще именно потому что тебе не надо изобретать с подменой текстур, с полигонами и т.п. )) у тебя есть объект и делать ты с ним можешь что угодно ))

Оффлайн NeonLight_Child

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
люди, пишите пожалуйста по делу, очень прошу...

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Исправь iostream.h на iostream.
Собрал, запустил, тень на месте, не моргает не исчезает.
Ubuntu 9.04, radeon 9600XT драйвер естественно открытый.
Проверил 2 вариант - всё работает.
Для спрайтов и SDL достаточно, проще и быстрее. Хотя дело вкуса.
« Последнее редактирование: 18 Сентября 2009, 02:13:26 от Упс »
xUbuntu 12.04

Оффлайн NeonLight_Child

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
    • Просмотр профиля
я нашол в чем была проблема)) все время менялась прозрачность. она у меня в звездном ветре менялась, надо было перед риcованием трафарета вернуть альфу на место glcolor4f(1,1,1,1); ;D :D ;D :D

Оффлайн maximum2000

  • Активист
  • *
  • Сообщений: 403
    • Просмотр профиля
Ну если любите 2d то может еще 1 спрайт/затекстурированный полигон на котором полупрозрачная текстура тени рисовать снизу, под самолетом, но над землей :)

 

Страница сгенерирована за 0.021 секунд. Запросов: 22.