Online video hd

Смотреть 4k видео

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

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

NeonLight_Child 16.09.2009 21:36

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

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

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



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


Тэги: c++ games opengl SDL вопрос игры
+ 2 -
Похожие Поделиться

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

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

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


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

Online video HD

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

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

Full HD video online

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

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

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