Форум: "Игры";
Текущий архив: 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