crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V  « < 2 3 4  
Ответить в данную темуНачать новую тему
> Попиксельное заполнение буфера
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
void FrameScene::drawBackground (QPainter *painter, const QRectF & rect)
{
    float xposition=-1.0, yposition=-1.0;
    if (painter->paintEngine()->type() != QPaintEngine::OpenGL && painter->paintEngine()->type() != QPaintEngine::OpenGL2)
    {
        qWarning("FrameScene: drawBackground needs a QGLWidget to be set as viewport on the graphics view");
        return;
    }
    float zoom =1.0;
    float zoomX =1.0, zoomY=1.0;
    
    zoom = 1.0;
    if(img.getLinesNumber() > sceneRect().height() || img.getColumnsNumber() > sceneRect().width() )
    {
        zoomY = static_cast<float>(this->sceneRect().height())/img.getLinesNumber();
        zoomX = static_cast<float>(this->sceneRect().width())/img.getColumnsNumber();
        zoom = qMin(zoomX, zoomY);
    }
    xposition = -zoom/(static_cast<float>(this->sceneRect().width())/img.getColumnsNumber());
    yposition = -zoom/(static_cast<float>(this->sceneRect().height())/img.getLinesNumber());
    
    glDisable(GL_ALPHA_TEST);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);
    
    glRasterPos2f(xposition, yposition);
    glPixelZoom(zoom, zoom);
    quint32 first=(img.data())[0];
    glDrawPixels (img.getColumnsNumber(), img.getLinesNumber(), GL_RGBA, GL_UNSIGNED_BYTE, img.data() );
}



img — это массив, хранящий изображение в градациях серого. Если ему подсунуть боевое изображение, то н-тысяч первых пикселей будут черными (естественно я проверял значение, которое ему подсовывают, там все совсем иное), если же где-то тупо memset-ом забить массив все будет ок. Что я не так делаю?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V  « < 2 3 4
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.11.2024, 4:04