![]() |
| ||
|
|
Новости |
Поиск |
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-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