Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многопроходная отрисовка ландшафта [Delphi, OpenGL]


Страницы:   1 2

Ricks ©   (2005-10-03 00:17:00) 

Народ, подскажите, каким образом лучше отрисовать многопроходный ландшафт?
Я делал так:
отрисовываю первый слой
включаю GL_ALPHA_TEST, ставлю glDepthTest( GL_ALWAYS )
рисую второй слой (выборочно, только там, где есть треугольники)

В результате у меня на карте 48*48 тормозит...

вот код:

// ПЕРВЫЙ ПРОХОД
glBegin(GL_TRIANGLES);
for k:=0 to pred(GMap.Mesh.NumTri) do begin

 if not FRST.AnyPointInFrustum(
  [
    GMap.Mesh.Trian[k, 1].V[1],
    GMap.Mesh.Trian[k, 1].V[2],
    GMap.Mesh.Trian[k, 1].V[3],

    GMap.Mesh.Trian[k, 2].V[1],
    GMap.Mesh.Trian[k, 2].V[2],
    GMap.Mesh.Trian[k, 2].V[3]
  ], 6 )
 then Continue;

 with GMap.Mesh.Trian[k, 1] do begin
  glColor3fv( @C[1] ); glTexCoord2fv( @T[1] );
  glNormal3fv( @N[1]); glVertex3fv( @V[1] );
  glColor3fv( @C[2] ); glTexCoord2fv( @T[2] );
  glNormal3fv( @N[2]); glVertex3fv( @V[2] );
  glColor3fv( @C[3] ); glTexCoord2fv( @T[3] );
  glNormal3fv( @N[3]); glVertex3fv( @V[3] );
 end;
 with GMap.Mesh.Trian[k, 2] do begin
  glColor3fv( @C[1] ); glTexCoord2fv( @T[1] );
  glNormal3fv( @N[1]); glVertex3fv( @V[1] );
  glColor3fv( @C[2] ); glTexCoord2fv( @T[2] );
  glNormal3fv( @N[2]); glVertex3fv( @V[2] );
  glColor3fv( @C[3] ); glTexCoord2fv( @T[3] );
  glNormal3fv( @N[3]); glVertex3fv( @V[3] );
 end;
end;
glEnd;
...
// ВТОРОЙ
glDepthFunc(GL_ALWAYS);
glBindTexture(GL_TEXTURE_2D, tex2);

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0);

glBegin(GL_TRIANGLES);
glNormal3f(0, 1, 0);
for k:=0 to pred(WMap.Mesh.NumTri) do begin
 if not FRST.AnyPointInFrustum(
  [
    WMap.Mesh.Trian[k, 1].V[1],
    WMap.Mesh.Trian[k, 1].V[2],
    WMap.Mesh.Trian[k, 1].V[3],

    WMap.Mesh.Trian[k, 2].V[1],
    WMap.Mesh.Trian[k, 2].V[2],
    WMap.Mesh.Trian[k, 2].V[3]
  ], 6 )
 then Continue;

 with WMap.Mesh.Trian[k, 1] do begin
  glTexCoord2fv( @T[1] ); glVertex3fv( @V[1] );
  glTexCoord2fv( @T[2] ); glVertex3fv( @V[2] );
  glTexCoord2fv( @T[3] ); glVertex3fv( @V[3] );
 end;
 with WMap.Mesh.Trian[k, 2] do begin
  glTexCoord2fv( @T[1] ); glVertex3fv( @V[1] );
  glTexCoord2fv( @T[2] ); glVertex3fv( @V[2] );
  glTexCoord2fv( @T[3] ); glVertex3fv( @V[3] );
 end;
end;
glEnd;

glDepthFunc(GL_LESS);
glDisable(GL_ALPHA_TEST);


Правильно ли я делаю??? А если что-то не так - скажите!


Ricks   (2005-10-09 02:42:00) [1]

забыл сказать:
http://www.ricks.pisem.net/screen10.jpg


Ricks   (2005-10-09 02:39:00) [2]

Убрал освещение (в смысле GL_LIGHT) и добавил LightMap'ы - смотрится немного получше!
На трех проходах + lightmap (+раздумье объектов) дает ~65 кадров на моем GeForce2


Кефир87   (2005-10-07 15:27:00) [3]

Вот так все просто?! Надо запомнить...


Ricks   (2005-10-07 00:45:00) [4]

А я уже нашел!!! :-D


if wglGetSwapIntervalEXT <> 0
 then wglSwapIntervalEXT(0);


0 - выключено
1 - включено


Кефир87   (2005-10-07 00:27:00) [5]

Это можно сделать в свой-ствах OpenGL дровоф. Кстати как это программно делать мне тоже интересно...


Ricks   (2005-10-07 00:11:00) [6]

Как это сделать в программе???


XProger   (2005-10-06 23:56:00) [7]

VSync отключи


Ricks   (2005-10-06 23:04:00) [8]

Я нашел причину тормозов!
У меня был включен GL_COLOR_MATERIAL и в отрисовке было
glNormal
glTexCoord
glColor
glVertex

Я выключил GL_COLOR_MATERIAL и убрал glColor!
FPS вырос с 50 до 75..80!!!!!!!!!!!!!!!

Только вот выше 100 он никак не поднимается! Даже без отрисовки:
glClear(...);
glLoadIdentity;
Exit;


XProger   (2005-10-06 02:00:00) [9]

В том примере Land используется ландшафт 513х513 вершин
Который делится на куски по 17х17 вершин. Вот эти куски и проверяются на видимость в раструбе камеры и по ним же строится QuadTree.


Zer0   (2005-10-06 01:48:00) [10]

(outdated)


Zer0   (2005-10-06 01:47:00) [11]

группа треугольников - это участок земли как минимум 10x10
причом проверка делается так - участок описывается bouning box и проверка на видимость провоится только с ним.
тестировать треугольники на видимость нереально.


Ricks   (2005-10-06 01:20:00) [12]

Вобщем надо так, наверное, делать:
разбивать карту на несколько групп (например по 8x8 квадратов), содержащие ВНУТРИ себя сведения (вершины итд) и при отрисовке выводить только эти группы, а не перебирая все вершины, смотреть, какая входит в видимые группы, а какая нет. Попробую...


Кефир87   (2005-10-06 01:09:00) [13]

Не, я о чем говорю, может куски ландшафта запихать в списки и выводить только кусок который виден... ну и соседние... Все-же списки дают значительный прирост производительности...


Ricks   (2005-10-06 00:27:00) [14]

А какая может быть ошбка?
Я рисую треугольниками - по 3 вершины.

Для каждой вершины:
-текстурные координаты
-цвет
-нормаль
-сама вершина

В чем может быть ошибка???


XProger   (2005-10-06 00:18:00) [15]

Ricks, для ландшафта с полигонами менее 100000 VBO прироста не даст (практически)!
Ищи ошибку в коде :)


Ricks   (2005-10-05 23:43:00) [16]

Списки, насколько я понимаю, не помогут - они же просто выполняют записанную последовательность. Правильно? Или я ошибаюсь?
Скороее всего придеться переписывать все с начала и использовать VBO или arrays.....


XProger   (2005-10-05 22:01:00) [17]

Кефир87, до VBO ей далеко ;)


Кефир87   (2005-10-05 21:35:00) [18]

Кстати полезная весчь: glGenLists, glNewList, glEndList, glCallList 8)


Ricks   (2005-10-05 13:41:00) [19]

Я, наверное, не так выразился...
Это примерное количество точек, которые рисуются за один проход. Вобщем проблеммы у меня еще наверное и с текстурами, так как на каждый треугольник накладывается куочек текстуры (размером 512x256), вобщем, наверное, надо переписывать польностью отрисовку!

Еще вопрос, у кого-нибудь есть "tablet.tv_" из установки ForceWare 78.01, а то скачал 30 мегобайт и нифига не устанавливается... :'(


XProger   (2005-10-05 01:23:00) [20]

Не вижу в процедуре цифры 1500


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо