[英]Qt QOpenGLWidget glClearColor not functioning correctly
从paintGL() 之外的各个地方调用glClearColor 时,我遇到了一个小问题。 目的是让用户能够即时设置清晰的颜色,但这不会按计划工作,除非在paintGL 中的每一帧都调用glClearColor。
目的:
void GLWidget::mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->pos();
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); //<-- Doesn't change clear colour
}
非最佳解决方法:
void GLWidget::mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->pos();
r = 1.0f;
g = 0.0f;
b = 0.0f;
a = 1.0f;
}
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glClearColor(r, g, b, a);
...
我认为这与 Qt 如何交换缓冲区和更新屏幕有关,但尚不清楚究竟是什么原因造成的。 任何想法都会很棒,谢谢。
我认为这与Qt交换缓冲区和更新屏幕的方式有关,但尚不清楚到底是什么原因引起的。 任何想法都很好,谢谢。
错误的,这与在没有OpenGL上下文绑定的情况下进行OpenGL调用有关。 在执行任何OpenGL调用之前,必须先调用makeCurrent
。
那为什么它在paintGL
中paintGL
? 因为Qt会在调用paintGL
, resizeGL
和initializeGL
之前自动使上下文成为当前上下文(请参阅其文档)。
我不认为@peppe 回答正确,因为您不需要调用 makeCurrent() 因为 Qt 已经
在我看来,您真正需要的只是mousePressEvent
的update()
调用。
如果你不想调用paintGL()来更新,你只需要调用update()
此外,您应该知道在glClearColor()
,您只在 OpenGL 状态机上设置 clearColor 属性。 glClear(GL_COLOR_BUFFER_BIT)
是真正清除颜色缓冲区的函数。 所以你应该在调用glClear()
之前通过glClearColor()
设置 clearColor 。
如果我是你,代码会是这样的:
void GLWidget::mousePressEvent(QMouseEvent *event)
{
m_lastPos = event->pos();
r = 1.0f;
g = 0.0f;
b = 0.0f;
a = 1.0f;
update();
}
void GLWidget::paintGL()
{
glClearColor(r, g, b, a);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.