Видео смотреть бесплатно

Смотреть жесткое видео

Официальный сайт mydebut 24/7/365

Смотреть видео бесплатно

16.09.09 21:36 NeonLight_Child

CodingГлюк с рисованием тени при использовании OpenGL

Здравствуйте.
Сейчас я делаю вертикальный 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
//рисуем затекстурированый полигон

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):

Код:
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
//рисуем затекстурированый полигон из общей текстуры

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();



}

 

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

Код:
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


          glClear(GL_STENCIL_BUFFER_BIT);// Очищаем буфер стенсила

//цвета теней не смешиваються!!! работает с глюками при выводе уровня из единой текстуры

          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.
То есть, чтобы тени не смешивались, хотя бы не рисовались на "дырах". Как это исправить ?

вот, собсно сами глючные исходники для раскрытия всей картины:
http://narod.ru/disk/13246865000/light.tar.gz.html

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



xT 16.09.09 22:18 # +4
Добавил подсветку и немного разметки =)
NeonLight_Child 17.09.09 20:59 # +0
спасибо)
cyrus 17.09.09 12:12 # +1
Вообще вопрос по OpenGL, а не по linux. Но если выложишь небольшой рабочий код и скажешь как его под linux запускать, то можно было бы посмотреть.
Вот кстати неплохо было бы написать обзоз о том, как заставить в линуксе работать вместе SDL и OpenGL.
NeonLight_Child 17.09.09 21:03 # +0
по OpenGl, я в нем, к сожалению, не очень силен:(
код выложил, поправил пост.
Компилировать командой make в терминал находясь в папке с исходниками.
Требуется наличие библиотек SDL (в убунте либы ставил через синаптик тыкая галочки рядом с libsdl* и libsdl-dev*)
NeonLight_Child 17.09.09 21:09 # +0
насчет статьи:) я тырил все из игры SDLball и какихто статей.
Там OpenGL включить то дело всего 2-ух строк. Посмотри мои глючные исходники)
Или мою другую игру-SwibPlex, я ее здесь где-то тоже выкладывал.

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 79)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 1636 из 131 города)
            Топ пользователей Топ блогов
            В сети: distruktor, Lost, m039, Craftuser, TiGR

            Новенькие: divius, xel, ser_dm, ruz, afiskon
            welinux.ru

            Смотреть онлайн бесплатно

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн