QPixmap работает поверх моей настройки glScissor (…)

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

Заголовочный файл

#ifndef MYOPENGLWIDGET_H
#define MYOPENGLWIDGET_H

#include <qopenglwidget.h>

class MyOpenGlWidget : public QOpenGLWidget
{
Q_OBJECT

public:
explicit MyOpenGlWidget(QWidget *parent = 0, Qt::WindowFlags f = Qt::WindowFlags());
virtual ~MyOpenGlWidget();

protected:
// these are supposed to be overridden, so use the "override" keyword to compiler check yourself
virtual void initializeGL() override;
virtual void resizeGL(int w, int h) override;
virtual void paintGL() override;
private:
QPixmap *_foregroundPixmap;
}

#endif

Исходный файл

QOpenGLFunctions_2_1 *f = 0;MyOpenGlWidget::MyOpenGlWidget(QWidget *parent, Qt::WindowFlags f) :
QOpenGLWidget(parent, f)
{
_foregroundPixmap = 0;
QPixmap *p = new QPixmap("beveled_texture.tiff");
if (!p->isNull())
{
_foregroundPixmap = p;
}
}

MyOpenGlWidget::~MyOpenGlWidget()
{
delete _foregroundPixmap;
}

void MyOpenGlWidget::initializeGL()
{
// getting a deprecated set of functions because such is my work environment
// Note: Also, QOpenGLWidget doesn't support these natively.
f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_2_1>();

f->glClearColor(0.0f, 1.0f, 0.0f, 1.0f);    // clearing to green
f->glEnable(GL_DEPTH_TEST);
f->glEnable(GL_CULL_FACE);  // implicitly culling front face
f->glEnable(GL_SCISSOR_TEST);

// it is either copy the matrix and viewport code from resizeGL or just call the method
this->resizeGL(this->width(), this->height());
}

void MyOpenGlWidget::resizeGL(int w, int h)
{
// make the viewport square
int sideLen = qMin(w, h);
int x = (w - side) / 2;
int y = (h - side) / 2;

// the widget is 400x400, so this random demonstration square will show up inside it
f->glViewport(50, 50, 100, 100);
f->glMatrixMode(GL_PROJECTION);
f->glLoadIdentity();
f->glOrtho(-2.0f, +2.0f, -2.0f, +2.0f, 1.0f, 15.0f);    // magic numbers left over from a demo
f->glMatrixMode(GL_MODELVIEW);

// queue up a paint event
// Note: QGLWidget used updateGL(), but QOpenGLWidget uses update().
this->update();
}

void MyOpenGlWidget::paintGL()
{
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// I want to draw a texture with beveled edges the size of this widget, so I can't
// have the background clearing all the way to the edges
f->glScissor(50, 50, 200, 200);     // more magic numbers just for demonstration

// clears to green in just scissored area (unless QPainter is created)
f->glClearColor(0.0f, 1.0f, 0.0f, 1.0f);

// loading identity matrix, doing f->glTranslatef(...) and f->glRotatef(...)

// pixmap loaded earlier in another function
if (_foregroundPixmap != 0)
{
// QPixmap apparently draws such that culling the back face will cull the entire
// pixmap, so have to switch culling for duration of pixmap drawing
f->glCullFace(GL_FRONT);

QPainter(this);
painter.drawPixmap(0, 0, _foregroundPixmap->scaled(this->size()));

// done, so switch back to culling the front face
f->glCullFace(GL_BACK);
}
QOpenGLFunctions_2_1 *f = 0;

void MyOpenGlWidget::initializeGL()
{
// getting a deprecated set of functions because such is my work environment
// Note: Also, QOpenGLWidget doesn't support these natively.
f = QOpenGLContext::currentContext()->versionFunctions<QOpenGLFunctions_2_1>();

f->glClearColor(0.0f, 1.0f, 0.0f, 1.0f);    // clearing to green
f->glEnable(GL_DEPTH_TEST);
f->glEnable(GL_CULL_FACE);  // implicitly culling front face
f->glEnable(GL_SCISSOR_TEST);

// it is either copy the matrix and viewport code from resizeGL or just call it directly
this->resizeGL(this->width(), this->height());
}

void MyOpenGlWidget::resizeGL(int w, int h)
{
// make the viewport square
int sideLen = qMin(w, h);
int x = (w - side) / 2;
int y = (h - side) / 2;

// the widget is 400x400, so this random demonstration square will show up inside it
f->glViewport(50, 50, 100, 100);
f->glMatrixMode(GL_PROJECTION);
f->glLoadIdentity();
f->glOrtho(-2.0f, +2.0f, -2.0f, +2.0f, 1.0f, 15.0f);    // magic numbers left over from a demo
f->glMatrixMode(GL_MODELVIEW);

// queue up a paint event
// Note: QGLWidget used updateGL(), but QOpenGLWidget uses update().
this->update();
}

void MyOpenGlWidget::paintGL()
{
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// I want to draw a texture with beveled edges the size of this widget, so I can't
// have the background clearing all the way to the edges
f->glScissor(50, 50, 200, 200);     // more magic numbers just for demonstration

// clears to green in just scissored area (unless QPainter is created)
f->glClearColor(0.0f, 1.0f, 0.0f, 1.0f);

// loading identity matrix, doing f->glTranslatef(...) and f->glRotatef(...), drawing triangles

// done drawing, so now draw the beveled foreground
if (_foregroundPixmap != 0)
{
// QPixmap apparently draws such that culling the back face will cull the entire
// pixmap, so have to switch culling for duration of pixmap drawing
f->glCullFace(GL_FRONT);

QPainter(this);
painter.drawPixmap(0, 0, _foregroundPixmap->scaled(this->size()));

// done, so switch back to culling the front face
f->glCullFace(GL_BACK);
}
}

Проблема в том, что этот код paintGL():

QPainter(this);

Как только объект QPainter создан, glScissor(...) вызов, который я сделал ранее в функции переполнен и какой-то glClearColor(...) сделан вызов (возможно из конструктора QPainter), который очищает весь видовой экран до цвета фона, который я установил сразу после glScissor(...), Затем растровое изображение отлично рисует мою скошенную текстуру.

Я не хочу, чтобы QPainter заполнил мои ножницы.

Самое близкое к объяснению два метода QPainter, beginNativePainting() а также endNativePainting(), Согласно документации, ножничное тестирование отключено между этими двумя, но в их примере они повторно включают его. Я попытался использовать этот код «родной рисования», но я не мог остановить простое существование QPainter от игнорирования ножниц GL и очистки всего моего окна просмотра.

Почему это происходит и как мне это остановить?

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

0

Решение

Почему это происходит

Контекст OpenGL является общим ресурсом, и вы должны поделиться им с другими игроками.

и как мне это остановить?

Ты не можешь Просто сделайте правильную вещь и установите видовой экран, ножничный прямоугольник и все остальные связанные с рисунком состояния на право момент: прямо перед тем, как вы начнете рисовать то, что зависит от этих настроек. Не устанавливайте их эоны (в компьютерном выражении) раньше, где-нибудь в «инициализации» или обработчике изменения формы. И ожидайте, что в коде рисования любая функция, которую вы вызываете, которая использует OpenGL, оставит некоторый мусор позади.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]