Как перевернуть текстуру внутри beginNativePainting ()? - PullRequest
3 голосов
/ 24 января 2012

Я пишу класс, который наследуется от QGLWidget :

class GLWidget : public QGLWidget
{
    Q_OBJECT

public:
    GLWidget(QWidget *parent = 0);
    ~GLWidget();

    void paintEvent(QPaintEvent *event);    

private:
    QImage* _frame;
};

Конструктор GLWidget загружает изображение с диска, а paintEvent() отвечает за отправку данных в графический процессор с помощью собственных вызовов OpenGL, которые выполняются между beginNativePainting() и endNativePainting(), и это работает нормально.

Проблема в том, что изображение отображается перевернутым (вертикально), и мне нужно это исправить. Я не нашел пути к этому, поэтому я надеюсь, что кто-нибудь может помочь мне в этом вопросе.

В нативном приложении Glut я мог бы просто вызвать glFrustum(), чтобы сделать переворот:

static void Reshape( int width, int height )
{
   glViewport( 0, 0, width, height );

   glMatrixMode( GL_PROJECTION );
   glLoadIdentity();

   glFrustum( -1.0, 1.0, 1.0, -1.0, 10.0, 100.0 );  // flip vertically

   glMatrixMode( GL_MODELVIEW );
   glLoadIdentity();
   glTranslatef( 0.0, 0.0, -15.0 );
}

Но я попытался загрузить матрицу проекции после beginNativePainting() и вызвать glFrustum() с теми же значениями, что и вышеупомянутый вызов, и все, что я получаю, это черный экран (что означает, что он не сработал, как ожидалось).

Какие-нибудь советы?

Кроме того, использование mirrowed(false, true) метода QImage для переворачивания не оказало никакого влияния на отображение изображения.

1 Ответ

3 голосов
/ 24 января 2012

Не переворачивайте проекцию, зеркально отразите координаты текстуры.

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

...