| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Освещение и скорость. |
| Автор: [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 | ||||
Я как обычно предложу списки.. Попробуй, если не удовлетворит - дальше будем разбирать.
А чем обычный glLight не подходит? |
| Автор: DENNN 11.1.2005, 10:34 | ||||
Я так понимаю, что тем и не подходит, что он обсчитывает всю сцену, а это в 50% излишняя нагрузка. Списки конечно помогут, но в принципе это не решение проблемы для больших сцен (там ведь не только освещение, но еще прозрачность, наложение различных данных, поиск пересечения с поверхностью и т.п.). В таких случаях может помочь только LOD. |
| Автор: p0s0l 14.1.2005, 22:10 |
| * использовать GL_QUADS вместо GL_TRIANGLES, тогда вместо 6 вершин нужно указать четыре; вообще, нужно стремится избегать лишних обращений к OpenGL * подсчитать нормали заранее * перейти на смешанные массивы (glInterleavedArrays), или просто массивы * скомпилировать массив (glLockArrays/glUnlockArrays) - т.к. одна и та же вершина используется в 6 треугольниках, то лучше обсчитать её (трансформация, освещение) 1 раз, чем 6 раз |