Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Программирование игр, графики и искусственного интеллекта > Освещение и скорость.


Автор: [WoPR]@!!ex 10.1.2005, 07:52
Мне сказали, что тут собираются гуру программирования. Два вопроса:
1)Поверхность храниться в двумерном массиве 256х256, каждый элемент хранит высоту поверхности в соответсвующей координате.
В цикле я эту поверхность отрисовываю. Скорость всего 30 кадров в секунду. Как быстрее отрисовывать?
for (y1 = 0; y1 < 255; y1++)
for (x1 = 0; x1 < 255; x1++)
{
glBegin(GL_TRIANGLES);
x=x1+1;
y=y1+1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x),(GLfloat)([Map[x][y]),(GLfloat)(y));
x=x1;
y=y1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x1),(GLfloat)(Map[x][y]),(GLfloat)(y1));
x=x1+1;
y=y1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x),(GLfloat)(Map[x][y]),(GLfloat)(y1));

x=x1;
y=y1+1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x1),(GLfloat)(Map[x][y]),(GLfloat)(y));
x=x1;
y=y1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x1),(GLfloat)(Map[x][y]),(GLfloat)(y1));
x=x1+1;
y=y1+1;
glTexCoord2f((GLfloat)((x)/256), (GLfloat)((y)/256));
glVertex3f((GLfloat)(x),(GLfloat)(Map[x][y]),(GLfloat)(y));
glEnd();

2) Как сделать быстрое освещение этой поверхности?

Автор: chipset 11.1.2005, 03:34
Цитата
@!!ex, 9.1.2005,  20:52]В цикле я эту поверхность отрисовываю. Скорость всего 30 кадров в секунду. Как быстрее отрисовывать?

Я как обычно предложу списки.. Попробуй, если не удовлетворит - дальше будем разбирать.

Цитата
@!!ex, 9.1.2005,  20:52]
2) Как сделать быстрое освещение этой поверхности?

А чем обычный glLight не подходит?

Автор: DENNN 11.1.2005, 10:34
Цитата
Я как обычно предложу списки..

Цитата
А чем обычный glLight не подходит?

Я так понимаю, что тем и не подходит, что он обсчитывает всю сцену, а это в 50% излишняя нагрузка.

Списки конечно помогут, но в принципе это не решение проблемы для больших сцен (там ведь не только освещение, но еще прозрачность, наложение различных данных, поиск пересечения с поверхностью и т.п.). В таких случаях может помочь только LOD.

Автор: p0s0l 14.1.2005, 22:10
* использовать GL_QUADS вместо GL_TRIANGLES, тогда вместо 6 вершин нужно указать четыре; вообще, нужно стремится избегать лишних обращений к OpenGL
* подсчитать нормали заранее
* перейти на смешанные массивы (glInterleavedArrays), или просто массивы
* скомпилировать массив (glLockArrays/glUnlockArrays) - т.к. одна и та же вершина используется в 6 треугольниках, то лучше обсчитать её (трансформация, освещение) 1 раз, чем 6 раз

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)