Попиксельное заполнение буфера |
Здравствуйте, гость ( Вход | Регистрация )
Попиксельное заполнение буфера |
BlueIceScream |
28.12.2011, 1:21
Сообщение
#31
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Такое использование буфера будет на мой взгляд быстрее. Оно позволяет полность отказаться от использование QImage и от сдвигов.
Выделяете для буфера место в 2 раза больше нужного для представления картинки. Заполнение состоит из 2 этапов. Первый : Начинаете заполнять буффер с конца. При этом каждая новая порция попадает вперед. То есть каждое новое изображение образуется из предыдущего простой сменой адреса начала данных в буффере. Нет необходимости делать сдвиги. Для рисования используйте функцию: void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data); Она позволяет рисовать изображение заданного размера и типа, напрямую из памяти. Например: glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, pointer); То есть при поступлении новых данных(сканированной строки) значения pointer(адрес начала данных для рисования) просто изменяется на необходимое значение. Никаких тяжелых сдвигов не нужно. А функция glDrawPixels использует аппартное ускорение для рисования. Единственная важная вещь это как хранятся данные в буффере. Они должны быть в GL формате. Например из QImage можно получить такой формат функцией: QImage QGLWidget::convertToGLFormat ( const QImage & img ) [static]. Но так как вам следует полностью избавится от QImage, то прочитайте про формат и используйте напрямую в буфере. Второй: Этот этап начинается когда данные заполнили размер буфера выделенный для изображения (вернее его половину так как выделяется в 2 раза больше места в памяти чем нужно). С этого момента данные начинают поступать в зарезервированную часть буфера. Рисование продолжается так же. Но запускает дополнительный поток который перекладывает поступившие данные на заднюю часть буфера. Когда уже буфер заполнится полностью, то первую половину будет дублировать вторая. Тогда переносим указатель на начало второй половины и работает как раньше. Как будто второй этап только начался. Как видите количество копирований максимально уменьшено. Используйте функцию glDrawPixels в событии void QGLWidget::paintGL () [virtual protected] Конечно синхронизация с остальной частью программы (в плане потоков) усложнится, но это позволит выжать максимум FPS. Сообщение отредактировал BlueIceScream - 28.12.2011, 1:24 |
|
|
loh |
28.12.2011, 14:14
Сообщение
#32
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
А как сделать зуммирование при рисовании картинки через опенгл тогда?
И посоветуйте какой нибудь системный монитор, смотреть загрузку процессора, видеокарточки, памяти? |
|
|
BlueIceScream |
28.12.2011, 21:22
Сообщение
#33
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Можете попробовать:
void glPixelZoom( GLfloat xfactor, GLfloat yfactor); void glScaled( GLdouble x, GLdouble y, GLdouble z); можете использовать также scaled от QImage: создаете изображение передав указатель на буффер QImage ( const uchar * data, int width, int height, Format format ) масштабируете QImage scaled ( const QSize & size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation ) const переводите в формат GL QImage QGLWidget::convertToGLFormat ( const QImage & img ) [static] рисуете передавая вместо GLvoid * data QImage::uchar * bits (); void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid * data); |
|
|
loh |
29.12.2011, 10:47
Сообщение
#34
|
Студент Группа: Участник Сообщений: 60 Регистрация: 11.5.2008 Пользователь №: 171 Спасибо сказали: 0 раз(а) Репутация: 0 |
Пока разбираюсь, полет нормальный, такой вопрос возник! вот увеличил я картинку больше размера viewport, но теперь что бы продвинуть её glRasterPos должен быть меньше -1, но при таком значении картинка исчезает ( как двигать картинку если она больше отображаемого пространства?
|
|
|
BlueIceScream |
29.12.2011, 16:09
Сообщение
#35
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Эта ветка по Qt. Если есть вопросы по работе функций OpenGL, обращайтесь на соответствующие форумы, где вам ответят профессионалы.
|
|
|
Гость_whatevillurks_* |
29.12.2011, 16:13
Сообщение
#36
|
Гости |
Зачот получается вы даете не профессиональные советы человеку
|
|
|
BlueIceScream |
29.12.2011, 16:24
Сообщение
#37
|
Студент Группа: Участник Сообщений: 56 Регистрация: 21.11.2011 Из: Республика Дагестан Пользователь №: 3016 Спасибо сказали: 18 раз(а) Репутация: 3 |
Конечно же нет. Я не профессионал. Я вообще не программист. Ответы которые я даю на форуме не возлагают на меня какой-либо ответственности. Хотите используйте, хотите нет.
|
|
|
Abesh |
17.1.2012, 17:11
Сообщение
#38
|
Студент Группа: Новичок Сообщений: 13 Регистрация: 4.6.2010 Пользователь №: 1780 Спасибо сказали: 2 раз(а) Репутация: 0 |
У меня по теме есть вопрос:
Проблема вот в чем, есть класс, унаследованный от QGraphicsScene, вот что из себя представляет drawBackground
img — это массив, хранящий изображение в градациях серого. Если ему подсунуть боевое изображение, то н-тысяч первых пикселей будут черными (естественно я проверял значение, которое ему подсовывают, там все совсем иное), если же где-то тупо memset-ом забить массив все будет ок. Что я не так делаю? |
|
|
Текстовая версия | Сейчас: 23.11.2024, 7:34 |