Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Вниз

Многопроходная отрисовка ландшафта   Найти похожие ветки 

 
Ricks ©   (2005-10-03 00:17) [0]

Народ, подскажите, каким образом лучше отрисовать многопроходный ландшафт?
Я делал так:
отрисовываю первый слой
включаю 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);


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


 
Zer0 ©   (2005-10-03 04:50) [1]

8(           )
1. проверка поподания в зону просмотра камеры никогда не делается для каждого треугольника модели - только для группы (не менее 1000 штук)
причем чаще всего модель описывается либо сферой либо прямоугольником
в твоем случае когда размер ландшафта крайе мал проверку вообще нужно убрать (т к время на отрисовку одного треугольика значительно меньше чем на проверку видимости КАЖДОГО треугольника)
2. задавать одну ячейку четыремя точками а не двумя группами по три.
3. упаковывать значния точек в массив и педеравать его сразу, а потом при отрисовке испотьзовать индесы.


 
Ricks ©   (2005-10-03 11:52) [2]


> 2.

А какая разница? Отрисовывать то все-равно 2 треугольника

Над проверкой попадания в область видимости я уже думал - придумал, что действительно надо делать группами.


> когда размер ландшафта крайе мал проверку вообще нужно убрать


если убрать проверку - тормозит... :(


 
Zer0 ©   (2005-10-04 01:25) [3]

^^так не бывает если отрисовка происходит аппаратными средствами.


 
Ricks ©   (2005-10-04 01:47) [4]

Вот, сделал эту самую многопроходную отрисовку (3 слоя) + проверку видимости групп треугольников. Тормозит конечно прилично, но терпимо...
http://www.ricks.pisem.net/screen3.jpg
http://www.ricks.pisem.net/screen4.jpg
http://www.ricks.pisem.net/screen5.jpg

PS:
рисую примерно так же:

procedure RenderMap;
var i : integer;
begin
glBindTexture(GL_TEXTURE_2D, GMap.Basic.Texture);
glBegin(GL_TRIANGLES);
for i:=0 to pred(GMap.Basic.Mesh.NumQd) do begin
 if not GMap.Groups[ GMap.Basic.Mesh.Quads[i, 1].G ].vis then Continue;
 glNormal3fv(@GMap.Basic.Mesh.Quads[i, 1].n[1]);
 .......
 glVertex3fv(@GMap.Basic.Mesh.Quads[i, 2].v[3]);
end;
glEnd;

glDepthFunc(GL_ALWAYS);
glEnable(GL_ALPHA_TEST);

glBindTexture(GL_TEXTURE_2D, GMap.Layer1.Texture);
glBegin(GL_TRIANGLES);
for i:=0 to pred(GMap.Layer1.Mesh.NumQd) do begin

 if not GMap.Groups[ GMap.Layer1.Mesh.Quads[i, 1].G ].vis or
   (GMap.Layer1.Tiles[i div GMap.Length, i mod GMap.Length] = empty) then Continue;

 glNormal3fv(@GMap.Layer1.Mesh.Quads[i, 1].n[1]);
 .......
 glVertex3fv(@GMap.Layer1.Mesh.Quads[i, 2].v[3]);
end;
glEnd;

glBindTexture(GL_TEXTURE_2D, GMap.Layer2.Texture);
glBegin(GL_TRIANGLES);
for i:=0 to pred(GMap.Layer2.Mesh.NumQd) do begin

 if not GMap.Groups[ GMap.Layer2.Mesh.Quads[i, 1].G ].vis or
   (GMap.Layer2.Tiles[i div GMap.Length, i mod GMap.Length] = empty) then Continue;

 glNormal3fv(@GMap.Layer2.Mesh.Quads[i, 1].n[1]);
 .......
 glVertex3fv(@GMap.Layer2.Mesh.Quads[i, 2].v[3]);
end;
glEnd;

glDisable(GL_ALPHA_TEST);
glDepthFunc(GL_LESS);
glColor3f(1, 1, 1);
end;


 
Ricks ©   (2005-10-04 01:49) [5]


> Zer0 ©   (04.10.05 01:25) [3]
> ^^так не бывает если отрисовка происходит аппаратными средствами


кстати, я не сказал у меня GeForce 2 MX 400, может поэтому тормозит?

PS: НО В WARCRAFT"e ТО НЕ ТОРМОЗИТ!!!!!!!!!!!!!!!!!!! :(((


 
XProger ©   (2005-10-04 03:01) [6]

Ricks, версия дровишек какая?


 
Ricks ©   (2005-10-04 11:31) [7]

Наверное, 71.89 я толком не понимаю... :)

вот: http://www.ricks.pisem.net/ver.jpg


 
A22 ©   (2005-10-04 12:20) [8]

1) к вопросу, почему 4 точки обсчитаются быстрее двух групп по 3. Кхм, потому что две группы по три точки - это уже шесть. Матрица-то применяется ко всем точкам, не так ли?

2) Проверка.. я что-то по скринам не понял, ландшафт плоский? Вид сверху или изометрия, без вращения? Если да, то может можно заранее высчитать, какие ячейки ландшафта видны? Если есть вращение, масштабирование и т.д., то разбивай ландшафт на куски хотя бы 30х30 ячеек, и проверяй попадаение на экран всех кусков. Поверь, видеокарта быстрее сама отбросит лишние треугольники, чем ты отсечешь их на процессоре.


 
XProger ©   (2005-10-04 16:22) [9]

AGP 2x - 512 мб пропускной способности
Щас вычислим какой нужен ландшафт чтобы убить шину при 30 FPS при 3-х слоях:

FPS: 30
SizeOf(TexCoord): 8
SizeOf(Normal): 12
SizeOf(Vertex): 12
Vertices: (Size - 1)^2 * 3
data: 512 * 1024 * 1024

Отсюда имеем формулу:
FPS * Layers * Vertices * (SizeOf(TexCoord) + SizeOf(Normal) + SizeOf(Vertex)) = data
(Size - 1)^2 = 16 * 1024 * 1024 / 270
В итоге получим Size ~= 250 :)
Значит шина при 48х48 отдыхает...

Следовательно, тормоза могут быть из-за:
1) Ошибка в коде, которую ты тщательно от нас скрываешь
2) Старые дровишки http://nvidia.com/content/drivers/drivers.asp

Посмотри FPS при однопроходном рендеринге ландшафта 512х512. http://xproger.mirg.ru/tmp/land.rar (F2 F3 F4 - оптимизации)


 
Sphinx ©   (2005-10-04 18:46) [10]

2 XProger ©
А ни чего, что http://xproger.mirg.ru/tmp/land.rar пока что недоступен ? :)
Вылажи на "народный" сайт...или ты его уже удалил ? =)))


 
XProger ©   (2005-10-04 20:54) [11]

Sphinx, сервер периодически падает. Но вот в данный момент всё благополучно качается :)


 
Sphinx ©   (2005-10-04 22:06) [12]

2 XProger ©
Когда постил - не качало :Р


 
Ricks ©   (2005-10-04 23:50) [13]


> A22

Рисуется то все-равно 2 треугольника (6 вершин), так что без разницы....

Ландшафт у меня - это карта высот. Предвидится и поворот камеры, итд итп, так что.....

> XProger
> AGP 2x - 512 мб пропускной способности


какие 512 МБ?

Может быть, у меня тормозит из-за цикла на процессоре (около 1500 повторений)?? Иных причин я не вижу......


> Ошибка в коде, которую ты тщательно от нас скрываешь

Какой надо показать код? Я покажу ЛЮБОЙ, лишь бы улучшить! :)


 
Ricks ©   (2005-10-04 23:53) [14]

Скачал land XProger"a. Вот такие результаты:
без ничего - 4..5 fps
только включенный LOD и VBO (кстати, что это такое) дают 30..50 fps


 
Ricks ©   (2005-10-04 23:56) [15]

XProger, можешь дать исходник, как реализовать LOD и VBO???????


 
XProger ©   (2005-10-05 00:38) [16]

Покажи главный цикл где там твои 1500 повторений ;)

VBO - Vertex Buffer Object http://steps3d.narod.ru/tutorials/tutorial-VBO.html
LOD - Level Of Detail (чем дальше тем меньше полигонов на ландшафте)
Cull - тут реализовано отсечение по QuadTree, т.е. невидимые части отсекаются здоровенными кусками, вплоть до отсечения всей карты за одну проверку.

Исходники не выложу, т.к. на данный момент полностью переписывается рендеринг и программа находится в не рабочем состоянии.


 
Ricks ©   (2005-10-05 01:15) [17]

Ну так RenderMap - это он и есть! (см выше)


 
XProger ©   (2005-10-05 01:23) [18]

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


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

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

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


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

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


 
XProger ©   (2005-10-05 22:01) [21]

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


 
Ricks ©   (2005-10-05 23:43) [22]

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


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

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


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

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

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

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


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

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


 
Ricks ©   (2005-10-06 01:20) [26]

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


 
Zer0 ©   (2005-10-06 01:47) [27]

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


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

(outdated)


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

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


 
Ricks ©   (2005-10-06 23:04) [30]

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

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

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


 
XProger ©   (2005-10-06 23:56) [31]

VSync отключи


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

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


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

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


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

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


if wglGetSwapIntervalEXT <> 0
 then wglSwapIntervalEXT(0);


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


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

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


 
Ricks ©   (2005-10-09 02:39) [36]

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


 
Ricks ©   (2005-10-09 02:42) [37]

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



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.013 c
10-1117473032
dread
2005-05-30 21:10
2006.04.23
Очистить буфер в Ворде.


15-1144043683
DelphiN!
2006-04-03 09:54
2006.04.23
Запретить замену и удаление файла


15-1144047436
Новичоккк
2006-04-03 10:57
2006.04.23
Только что узнал что Razorback закрыли (eMule)


15-1143791714
Новичоккк
2006-03-31 11:55
2006.04.23
Вопрос по DLL в Delphi


3-1141034307
neat
2006-02-27 12:58
2006.04.23
Query





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский