LINUX.ORG.RU

[opengl & freeglut][осмысление процесса] отрисовка сцены с разным количеством объектов в разное время


0

1

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

Я не очень понял, как устроена работа с opengl - в туториалах я вижу следующий подход: 1. написали функцию для отрисовки сцены - в ней в туториалах обычно присутствует объект типа «красивый кубик», а также какая-нибудт команда поворота сцены 2. возможно, запилили реакцию на мышиные/клавиутарные события 3. инициализировали glut, пихнули первую функцию в glutDisplayFunc()

в результате имеем, например, вращающийся кубик.

Вопросы примерно такие: 1. Рисование куба - предлагается либо пользоваться glutWireCube и подобным (плохо тем, что рисуется «в фокусе», не принимает координаты центра), либо задать стопицот точек и по ним пройтись GL_LINE_LOOP или чем-то таким (неудобно тем, что много текста, каждый набор точек для, например, куба, приходится перечислять вручную) 2. Вот у них в примерах написано, что для рисования вращающегося куба нужно написать glrotatef в той функции, которую потом суют в glDisplayFunc - вращается, я так понимаю, только камера? С какой частотой она при этом поворачивается на угол, указанный среди параметров функции поворота? Где поменять временной интервал?

Хочется понять, как отвязать отрисовку объектов от их (или камеры) движения, а также разобраться с отрисовкой объектов по необходимости (в моем случае мне не хочется держать в памяти координаты всех вершин всех кубиков, даже тех, которые на данном шагу не видны).

1. Не распарсил. Забудь про глют. Рисуешь в цикле кубики одним из нормальных спосоюоб и всё. Что не понятно?

2. Не распарсил. Какая частота? при чем тут частота?. Про матрици почитай. Ничто никуда не движется. Идут преобразования координат примитива(координата умножается на матрицу) и всё.

Galant ()

С какой частотой она при этом поворачивается на угол, указанный среди параметров функции поворота? Где поменять временной интервал?

А , кажется понял. Ты хочешь каждый вызов домножать на матрицу поворота?
Ну тогда будет поворот с частотой вызова твоей функции)) К тому же будет накапливаться ошибка округления.

Galant ()

1. Лучше создать функцию, которая по координате точки рисует куб соответствующего размера.
2. После долгих скитаний понял, что шейдеры ввели не зря. Используя их намного проще разобраться, что конкретно происходит в конвейере. Конкретно - координаты объектов и камеры.

Хотя я особенно много в OpenGL не копался.

P.S. Есть небольшой пример на OpenGL без шейдеров. В центре стоит кубик, можно двигаться влево/вправо/вверх/вниз и вращать камеру. Если интересно - могу скинуть.

trex6 ★★★★★ ()

Вот оно результат интернетов. Вместо вдумчивого чтения литературы, документации сразу лезут на форумы и спрашивают даже сами не понимают что.

Вопрос конкретно какой? Как работать с ОпенГЛ? google opengl для начинающих

anonymous ()
Ответ на: комментарий от Galant

Забудь про глют.

Допустим, каким образом тогда работать с библиотекой? Дергать описанные в ней функции напрямую? Не вижу в репозитории wheezy main ничего, что было бы похоже на opengl для c/c++ - для перла есть, для хаскеля, для gnash, для сей не вижу. Или я чего-то не понимаю?

Рисуешь в цикле кубики одним из нормальных спосоюоб и всё.

Каким?

Не распарсил. Какая частота? при чем тут частота?. Про матрици почитай.

Частота - это как часто происходит умножение на матрицу. Если визуально что-то вращается, значит, раз в сколько-то миллисекунд что-то происходит, вот это количество миллисекунд меня и интересует.

pianolender ★★★ ()
Ответ на: комментарий от anonymous

Есть что сказать - скажи.

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

Опускать меня можешь сколько влезет, я не программист, и мои профессиональные чувства так не задеть.

pianolender ★★★ ()
Ответ на: комментарий от pianolender

#include <GL/gl.h>
#include <GL/glx.h>

Какова твоя задача? Нарисовать пару кубиков и забыть или всё-таки чтото серьезно изучить?
Если первое, то можешь и глют. Отрисовку по таймеру сделай и всё.

Galant ()
Ответ на: комментарий от Galant

Когда кубиков будет порядка 50х50х50, мне наверняка понадобится это добро оптимизировать, так что «сделать и забыть» в данном случае не хочу. Кроме того, я хочу быть в теме, как сейчас работают с графикой.

pianolender ★★★ ()
Ответ на: комментарий от pianolender

как сейчас работают с графикой.

Да вы тогда сайтом ошиблись, сейчас с графикой работают на DirectX 11.

anonymous ()
Ответ на: комментарий от anonymous

Реализация DirectX есть под линукс?

Думаю, разница между средствами, более типичными для винды, и средствами, более типичными для линукса, не так заметна, как разница между чем-то из них и графикой в borland pascal 7.0 под досом, так что для приблизительного понимания мне хватит и линуксовых средств.

pianolender ★★★ ()
Ответ на: комментарий от pianolender

Вот пример: http://webfile.ru/5713478
Есть проект для qmake. Там же должен быть уже готовый Makefile, но не обещаю, что он у Вас заработает.

Еще нашел вот это: http://webfile.ru/5713479
Вроде бы тоже рабочий, но я давно его не трогал.

P.S. Все же настоятельно рекомендую посмотреть в сторону шейдеров. С ними все становиться намного более прозрачным.

trex6 ★★★★★ ()
Ответ на: комментарий от anonymous

Упоротые анонимусы нынче пошли.
Теперь все работают с графикой на OpenGL ES, ибо там основной профит.
За исключением больших контор, конечно.

trex6 ★★★★★ ()
Ответ на: комментарий от pianolender

Когда кубиков будет порядка 50х50х50

instansing в помощь. Точнее без него никак, ибо производительность просядёт в несколько порядков, из-за огромного кол-ва вызовов отрисовки. Координаты придётся брать из тектурного буфера.

Координаты можно считать на проце (что отчасти накладно - т.к. и просчёт значительно дольше, и перегон данных в память видюхи - дело лишнее и небыстрое). Можно считать на видюхе - в рендербуфер через шейдер, а потом копируешь содержимое рендербуфера в текстурный буфер.

З.Ы. из задачи понял только то, что будет большое кол-во вращающихся кубиков.

rip86oz ()
Ответ на: комментарий от rip86oz

из задачи понял только то, что будет большое кол-во вращающихся кубиков.

Вращаться они будут только все вместе, да и то не факт, что будут. Суть в том, что в массиве по некоторым правилам с течением времени происходят изменения - это клеточный автомат - и наличие или отсутствие в определенных точках кубика отражает состояние ячейки трехмерного массива.

Instansing, шейдеры. Буду гуглить.

pianolender ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.