![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многопроходная отрисовка ландшафта [Delphi, OpenGL]
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-05 01:15:00) [21]Ну так RenderMap - это он и есть! (см выше)
XProger (2005-10-05 00:38:00) [22]Покажи главный цикл где там твои 1500 повторений ;)
VBO - Vertex Buffer Object http://steps3d.narod.ru/tutorials/tutorial-VBO.html
LOD - Level Of Detail (чем дальше тем меньше полигонов на ландшафте)
Cull - тут реализовано отсечение по QuadTree, т.е. невидимые части отсекаются здоровенными кусками, вплоть до отсечения всей карты за одну проверку.
Исходники не выложу, т.к. на данный момент полностью переписывается рендеринг и программа находится в не рабочем состоянии.
Ricks (2005-10-04 23:56:00) [23]XProger, можешь дать исходник, как реализовать LOD и VBO???????
Ricks (2005-10-04 23:53:00) [24]Скачал land XProger'a. Вот такие результаты:
без ничего - 4..5 fps
только включенный LOD и VBO (кстати, что это такое) дают 30..50 fps
Ricks (2005-10-04 23:50:00) [25]
> A22
Рисуется то все-равно 2 треугольника (6 вершин), так что без разницы....
Ландшафт у меня - это карта высот. Предвидится и поворот камеры, итд итп, так что.....
> XProger
> AGP 2x - 512 мб пропускной способности
какие 512 МБ?
Может быть, у меня тормозит из-за цикла на процессоре (около 1500 повторений)?? Иных причин я не вижу......
> Ошибка в коде, которую ты тщательно от нас скрываешь
Какой надо показать код? Я покажу ЛЮБОЙ, лишь бы улучшить! :)
Sphinx (2005-10-04 22:06:00) [26]2 XProger ©
Когда постил - не качало :Р
XProger (2005-10-04 20:54:00) [27]Sphinx, сервер периодически падает. Но вот в данный момент всё благополучно качается :)
Sphinx (2005-10-04 18:46:00) [28]2 XProger ©
А ни чего, что http://xproger.mirg.ru/tmp/land.rarпока что недоступен ? :)
Вылажи на "народный" сайт...или ты его уже удалил ? =)))
XProger (2005-10-04 16:22:00) [29]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 - оптимизации)
A22 (2005-10-04 12:20:00) [30]1) к вопросу, почему 4 точки обсчитаются быстрее двух групп по 3. Кхм, потому что две группы по три точки - это уже шесть. Матрица-то применяется ко всем точкам, не так ли?
2) Проверка.. я что-то по скринам не понял, ландшафт плоский? Вид сверху или изометрия, без вращения? Если да, то может можно заранее высчитать, какие ячейки ландшафта видны? Если есть вращение, масштабирование и т.д., то разбивай ландшафт на куски хотя бы 30х30 ячеек, и проверяй попадаение на экран всех кусков. Поверь, видеокарта быстрее сама отбросит лишние треугольники, чем ты отсечешь их на процессоре.
Ricks (2005-10-04 11:31:00) [31]Наверное, 71.89 я толком не понимаю... :)
вот: http://www.ricks.pisem.net/ver.jpg
XProger (2005-10-04 03:01:00) [32]Ricks, версия дровишек какая?
Ricks (2005-10-04 01:49:00) [33]
> Zer0 © (04.10.05 01:25) [3]
> ^^так не бывает если отрисовка происходит аппаратными средствами
кстати, я не сказал у меня GeForce 2 MX 400, может поэтому тормозит?
PS: НО В WARCRAFT'e ТО НЕ ТОРМОЗИТ!!!!!!!!!!!!!!!!!!! :(((
Ricks (2005-10-04 01:47:00) [34]Вот, сделал эту самую многопроходную отрисовку (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;
Zer0 (2005-10-04 01:25:00) [35]^^так не бывает если отрисовка происходит аппаратными средствами.
Ricks (2005-10-03 11:52:00) [36]
> 2.
А какая разница? Отрисовывать то все-равно 2 треугольника
Над проверкой попадания в область видимости я уже думал - придумал, что действительно надо делать группами.
> когда размер ландшафта крайе мал проверку вообще нужно убрать
если убрать проверку - тормозит... :(
Zer0 (2005-10-03 04:50:00) [37]8( )
1. проверка поподания в зону просмотра камеры никогда не делается для каждого треугольника модели - только для группы (не менее 1000 штук)
причем чаще всего модель описывается либо сферой либо прямоугольником
в твоем случае когда размер ландшафта крайе мал проверку вообще нужно убрать (т к время на отрисовку одного треугольика значительно меньше чем на проверку видимости КАЖДОГО треугольника)
2. задавать одну ячейку четыремя точками а не двумя группами по три.
3. упаковывать значния точек в массив и педеравать его сразу, а потом при отрисовке испотьзовать индесы.