Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: bond от Январь 17, 2007, 23:57



Название: QT+OpenGL: растеризация
Отправлено: bond от Январь 17, 2007, 23:57
С трехмеркой никада не сталкивался, а тут диплом навалился :shock:
Подсакажите, пожалуйста, какими алгоритмами реалзиован рендеринг в QT (названия, теорию сам найду) и чем отличается  renderPixmap(...) от grabFrameBuffer(...)? С точки зрения не реализации, а результата - что для чего лучше подходит (отличия QPixmap от QImage, слава Богу, понятны :lol:)
Спасибо!
_____
Qt - 4.1.4, OpenGL - 1.1 (кажется, в общем - Windowый).


Название: QT+OpenGL: растеризация
Отправлено: Dendy от Январь 18, 2007, 00:40
Рендеринг в Qt  происходит через QPaintEngine - интерфейс рисования, что перенаправляет операции QPainter'а. Софтвар - собственньІй бьІстрьІй растровьІй движек. АппаратньІй рендеринг - через OpenGL API. Фактически - рисованиями примитивов (+ градиентьІ с помощью шейдеров, если таковьІе имеются). renderPixmap() - прогнать операцию рисования на отдельном контексте, которьІй потом сграбится в картинку. grabFrameBuffer() - преобразовать текущее содержимое буфера в картинку, аналог - glReadPixels().

Собственно, какая задача то?


Название: QT+OpenGL: растеризация
Отправлено: bond от Январь 18, 2007, 10:06
Задача - подвести теоритическую базу под уже готовое (программулька - очень обрубленный Paint от трехмерной графики, рендерю через grabFrameBuffer()).
На возможный вопрос: "А че вы там с рендерингом намутили?" ответ: "я - ниче, все Тролли сделали" - не канает. Если попросят поподробнее про использованную технологию растеризации - посылать членов ГАКа читать исходники как-то неудобно.
Про алгоритм растеризации - в исходники, разумеется, нихто заглядывать не станет, и если я назову какой-нить на самом деле не используемый, то ниче особо страшного не случится. Но при этом хочется разобраться, а чтобы почерпнуть че-нить по данному вопросу из исходников QT - надо знать хотябы, какие алгоритмы бывают и вообще, чего искать.
Теперь про использование renderPixmap() и grabFrameBuffer(). Судя по доке, renderPixmap() создает новый контекст, применяет к нему initializeGL(), paintGL() и resizeGL() (может, еще updateGL(), точно не помню), при этом на содержимое создаваемой сцены влияет только функционал перечисленных методов. Если же текущая картинка на сцене - результат вращения, реализованного, например, через обработчик мыши, то renderPixmap() это вращение не учитывает и на выходе дает "первоначальный" вариант отображения объекта, сформированный "стандартными" paintGL() etc.
Таким образом, как я понял, если функционал, влияющий на отображение расположен де-то вне init-paint-resize-updateGL(), то для рендеринга надо использовать grabFrameBuffer(), иначе - renderPixmap() . Я прав?


Название: QT+OpenGL: растеризация
Отправлено: bond от Январь 20, 2007, 02:03
Собственно, предзащитлись =)
В смысле, дальнейшее литье воды считаю нецелесообразным и вопрос можно считать закрытым.
Dendy, спасибо за участие.