Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод трехмерной матрицы, Как оптимизировать? 
:(
    Опции темы
Nikonik
Дата 21.3.2007, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Казалось бы простая задача - а найти не могу

Есть трехмерная матрица M[][][]

сейчас я ее вывожу набором вложенных for и рисую куб если в матрице не ноль.
по отрисовке перемещаюсь gl_translatef, после каждого блока for возращаю на суммарный сдвиг

При размере матрицы до 40 -- FPS еще держится на уровне 30-40,  даже уже при размере 64 начинаются дикие тормоза - 3-4 FPS. (я вращаю матрицу)
Я использую библиотеку GLUT.
При GLAUX ситуация чуть лучше. но не намного.
Хочется выводить матрицы размером хотя бы до 256.

Матрица создается в начале программы и больше не меняется
Возможно как-то можно загнать эту структуру в единый объект, или прорисовывать только видимые кубы? 
Подскажите, пожалуйста.

Это сообщение отредактировал(а) Nikonik - 21.3.2007, 13:13
PM MAIL   Вверх
Rickert
Дата 23.3.2007, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Размер матрицы - это что? Ты же сказал, что у тебя трёхмерная матрица.
В любом случае, делай так: получай все вершины все х объектов в один массив такого типа: x1, y1, z1, x2, y2, z2 и используй glDrawElements.
Как его юзать, читай progz.ru


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Nikonik
Дата 28.3.2007, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Размер матрицы это количество элементов в одной грани
матрицы размером до 256 - это 256х256х256

glDrawElements начал читать....
PM MAIL   Вверх
Rickert
Дата 29.3.2007, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Ну тогда делаешь так:
Вычисляешь по размеру матрицы координаты вершин куба. По сути у тебя каждая ячейка - это куб. Следовательно тебе нужно просто получить точки (если матрица 3х3х3) вершин 27 кубов. Загоняешь их в один массив, отрисовываешь через drawElements или drawArray, затем ставишь по местам текст со значениями каждой ячейки. Но быстрее будет, если ты будешь работать с текстом, как с полигонами, имея их вершины и выводя также через drawArray или drawElements.

ЗЫ
progz.ru - там перевод красной книги openGL. Очень советую сохранить всё это дело, хороший справочник выходит. Ещё достань книгу Анджела "Программирование графики на opengl", там много мат. трюков и этого тебе хватит на реализацию и понятие азов минимум половину алгоритмов.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Nikonik
Дата 4.4.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



попробовал DrawElements - действительно быстрее, но заодно прочитал и о такой вещи как VBO - она должна еще более ощутимый прирост

Цитата

Загоняешь их в один массив, отрисовываешь через drawElements или drawArray


а как определить порядок вершин? по-моему тут это главная задача

не понял о каком тексте идёт речь

не понял про красную книгу, но progz, читать начал


PM MAIL   Вверх
Rickert
Дата 4.4.2007, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



Есть такая штука - красная книга ogl, там расписаны принципы функционирования его. Так вот: на progz.ru - это перевод этой самой книги.
Цитата(Nikonik @  4.4.2007,  13:24 Найти цитируемый пост)
а как определить порядок вершин?

Порядок на сколько мне известно значения не имеет. Главное чтобы в памяти лежало так, как ты укажешь в параметрах, при вызове функций.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
FIaR
Дата 4.4.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.11.2006

Репутация: 2
Всего: 2



Если юзаеш DrawElements (даже если и drawArray) то порядок вершин имеет весомое значение!


--------------------
Шуруп забитый молотком, держится лучше, чем гвоздь закрученый отверткой.  
PM MAIL   Вверх
Rickert
Дата 5.4.2007, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



FIaR, и какое?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Nikonik
Дата 8.4.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



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

С VBO пока не лады.. не могу найти толкового объяснения.


PM MAIL   Вверх
betal
Дата 17.4.2007, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



 smile 
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Rickert
Дата 17.4.2007, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 2
Всего: 52



betal, какой пример ещё?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
betal
Дата 19.4.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 26.12.2006

Репутация: нет
Всего: 1



на то что получилось.

Это сообщение отредактировал(а) betal - 19.4.2007, 21:26
--------------------
101100010100001101100001110100101111011легкие деньги
PM WWW ICQ   Вверх
Nikonik
Дата 15.6.2007, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 21.3.2007

Репутация: нет
Всего: нет



Sorry, на форум не заходил smile
Нашел через поисковик - google top по запросу "glaux вывод FPS" - что подтвержает, что мало все-таки литературы по gl в рунете.

С неплохими задержками люди примеры хотят, получилось вот так:

Вершины шестиугольников (в моей пркиладной задаче - шестиугольники)
Код

GLfloat vertices[] =                    //шестиугольник
        {
                   -0.5,0,0,
                   -0.25,0.433,0,
                   +0.25,0.433,0,
                   +0.5,0,0,
                   +0.25,-0.433,0,
                   -0.25,-0.433,0,
                   -0.5,0,0.25,
                   -0.25,0.433,0.25,
                   +0.25,0.433,0.25,
                   +0.5,0,0.25,
                   +0.25,-0.433,0.25,
                   -0.25,-0.433,0.25                 
        }       ;                            
GLuint indices[] = {                //вершины в правильном порядке обхода
                    1,0,6,7,
                    2,1,7,8,
                    3,2,8,9,
                    4,3,9,10,
                    5,4,10,11,
                    0,5,11,6,
                    0,1,2,3,
                    3,4,5,0,
                    9,8,7,6,
                    6,11,10,9,
                    6,7,8,9,
                    9,10,11,6
                    };



Вывод:
Код

static void draw_p(unsigned char x,unsigned char y,unsigned char z)
{
            unsigned char val = M[(x<<16)+(y<<8)+z];
            char clrstr[80];
            float r,g,b;           
           glPushMatrix();     
              glColor3f(colors[val][0],colors[val][1],colors[val][2]);
              glTranslatef((x-128),(y-128),(z-128)/4.0);
              if (x&1) glTranslatef(0,0.5,0); //смещение гексагональной решётки
              glDrawElements (GL_QUADS, 40, GL_UNSIGNED_INT, indices);
            glPopMatrix();
}



В main не забыть привязать:
Код

    glEnableClientState (GL_VERTEX_ARRAY);
    glVertexPointer (3, GL_FLOAT, 0, vertices);

и отвязать smile
Код

         glDisableClientState (GL_VERTEX_ARRAY);


дополнительно ради чего мучался с порядком обхода - culling

Код

        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK);}

Ну и еще ускорение за счет разрежености матриц + линеаризация трехмерного массива в одномерный M.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.