Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.049 c
6-1136889525
antoxa2005
2006-01-10 13:38
2006.04.23
Подскажите. 2-а компьютера в разных городах, у обоих выделенная


1-1142502896
КаПиБаРа
2006-03-16 12:54
2006.04.23
Как сделать Абстрактный property


2-1144753994
ffo
2006-04-11 15:13
2006.04.23
Допишите строку!!!!!!!!


2-1144264669
skovorodka
2006-04-05 23:17
2006.04.23
Помогите, плиз, с запросом...


3-1141289804
Oxy
2006-03-02 11:56
2006.04.23
Строка подключения к аксессу