- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个QMainWindow
,里面有一个QGLWidget
。我希望小部件显示我自己选择的“清晰”颜色,而不是默认的黑屏。
void MyQGLWidget::initializeGL(void) {
glClearColor(0.7f, 0.7f, 0.7f, 1.0f);
}
void MyQGLWidget::paintGL(void) {
qDebug("Painting grey-ness");
glClear(GL_COLOR_BUFFER_BIT);
// ... Do more stuff, but only after a certain event has happened ...
}
这有效,我注意到在启动期间该方法被调用了 4 次。但是,我只想在 paintGL()
方法中将其绘制为空白一次,因为启动后经常调用此方法,如果缓冲区实际上会有很小但很重要的性能损失每次调用都会被清除。
所以我把代码改成这样:
void MyQGLWidget::paintGL(void) {
static bool screenOnBlank = false;
if (!screenOnBlank) {
qDebug("Painting grey-ness");
glClear(GL_COLOR_BUFFER_BIT);
screenOnBlank = true;
}
// ... Do more stuff, but only after a certain event has happened ...
}
现在清除只完成一次,但我留下的是黑屏,而不是 glClearColor
的灰屏。为什么是这样?为什么 QGLWidget 再次将我的屏幕涂黑?更重要的是,我如何才能确保屏幕是我自己的默认颜色,而不是在每个时间步骤都将其重新绘制为空白?
最佳答案
简答:
在大多数平台中,执行缓冲区交换后,后台缓冲区的状态是未定义。您可以找到更多详细信息 here .因此,您不能依赖缓冲区在交换操作之前离开时的行为。然后,为确保您的程序是跨平台的,除了在每次绘图时调用 glClear()
之外,您别无选择。
实践中:
有可能您的平台/配置确实保证您的缓冲区不变,或者不保证,但在实践中仍然如此。如果您在试验后知道自己处于这些情况下(见下文),但屏幕仍然变黑,这意味着您在代码中以某种方式做了一些“错误”的事情,这使得 Qt 显式调用 glClear()
有它自己的 glClearColor()
。
您可以使用此代码查看在 swapBuffers() 之后缓冲区是否保持不变。在我的配置中实际上是这样的:Qt 4.8 on Linux 64bits:
// -------- main.cpp --------
#include <QApplication>
#include "GLWidget.h"
int main(int argc, char ** argv)
{
QApplication app(argc, argv);
GLWidget * w = new GLWidget();
w->show();
return app.exec();
}
// -------- GLWidget.h --------
#include <QGLWidget>
#include <QTimer>
class GLWidget: public QGLWidget
{
Q_OBJECT
public:
GLWidget() : i(0), N(60)
{
timer.setInterval(16);
connect(&timer, SIGNAL(timeout()),
this, SLOT(animationLoop()));
timer.start();
}
protected:
void initializeGL()
{
glClearColor(1.0, 0.0, 0.0, 1.0);
}
void resizeGL(int w, int h)
{
glViewport(0, 0, (GLint)w, (GLint)h);
}
void paintGL()
{
bool test = false;
if(i<N)
{
if(test)
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
else
{
if(test)
{
glClearColor(0.0, 1.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
}
}
private slots:
void animationLoop()
{
i++;
if(i>2*N) i=0;
updateGL();
}
private:
int i, N;
QTimer timer;
};
如果 test == true
,那么我总是调用 glClearColor()
,然后调用 glClear()
,但在每秒红色和绿色。我确实看到颜色在红色和绿色之间来回切换。
如果 test == false
,那么我只在 initializeGL()
中一次性调用 glClearColor()
。然后在 paintGL
中,我交替调用 glClear()
或不调用它。屏幕保持红色,即永远不会变黑(或显示 unicorn ),即使未调用 glClear()
也是如此。
因此,关于您的问题:
要么你的配置和我的不一样(swapBuffers的实现是Qt提供的,根据底层window系统不同)
或者您的代码已损坏。
简单的检查方法:编译我的代码,看看它是否仍然重现问题。如果是这样,那么你就是情况 1.,你对此无能为力(可以被认为是 Qt 的一个错误,而不是不一致,因为文档中的任何地方都没有指定正确的行为)。否则,您属于情况 2.,那么您应该提供更多代码,以便我们确定问题出在哪里。
关于c++ - 使用 glClearColor 初始化 QGLWidget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17295963/
我很难理解为什么我用 openGL 做的窗口保持黑色。 我没有看到我在代码中哪里出错了: import com.jogamp.opengl.awt.GLCanvas import com.jogamp
我开始了 sdl 和 opengl 类(class)。当我尝试更改背景时遇到一个问题,此功能没有给出任何结果。我使用 MSVS 和 Win8.1。我正在尝试使用各种带参数的选项。我总是有黑色背景。有什
我正在将 GLES2 和 EGL 与 PyOpenGL 一起使用,我正在调用 glClearColor(0.0, 0.0, 0.0, 1.0) .后 glClear(GL_COLOR_BUFFER_B
我是 LWJGL 和 OpenGL 的新手,我已经进行了一些谷歌搜索,但似乎找不到任何与此相关的其他内容。 我制作了一个基本的测试程序来创建一个空白窗口。我可以创建窗口并正常运行应用程序,但如果我尝试
glViewport(x(), y(), width(), height()); glDisable(GL_DEPTH_TEST); glClearColor(0, 0.3, 0, 1); glCle
我正在开发一个简单的 OpenGL 应用程序,它允许用户通过单击并向左(使其不那么强烈)或向右(更加强烈)拖动来调整简单窗口的背景颜色。例如,当向右拖动时,我有这样的结果: intensity +=
我正在尝试在 C++ 中运行我的第一个 opengl 程序,它会在 Mac OS X 上的终端打开一个窗口、设置背景颜色并给出标题。 代码可以正常编译和链接。当我运行该程序时,窗口和标题可以正常打开,
gl.glClearColor(0f, 0f, 0f, 1.0f); 如何阅读?如: set clear color 或 clear the color ? 最佳答案 @Mikola 的回答是正确的,
我正在尝试创建一个单独的 OpenGL 窗口,其中包含在 RGB 颜色选择器中选择的一些背景颜色,但看起来我在这个函数中遗漏了一些重要的东西。当我想将颜色设置为标准时,例如红色,它可以工作。 glCl
我只是想绘制背景,用 0.5f 透明黑色覆盖它以使其变暗,并在其顶部渲染暂停菜单。 我已经尝试过: Gdx.gl.glClearColor(0f, 0f, 0f, 0.5f); Gdx
从 paintGL() 之外的各个地方调用 glClearColor 时,我遇到了一个小问题。目的是让用户能够即时设置清晰的颜色,但这不会按计划工作,除非在 paintGL 中的每一帧调用 glCle
我想在运行时更改我的应用程序的背景颜色。所以在单击按钮时我首先调用: GLES20.glClearColor(color[0], color[1], color[2], color[3]); 然后我调
我有一个QMainWindow,里面有一个QGLWidget。我希望小部件显示我自己选择的“清晰”颜色,而不是默认的黑屏。 void MyQGLWidget::initializeGL(void) {
我一直在努力理解 glReadPixels 的输出,这在理论上似乎很简单,但实际上会产生令人费解的(至少对我而言)结果。 假设我有一个简单的片段着色器,它绘制一个颜色值为 vec4(0.2, 0, 0
在 OpenGL 中,为了获得适当的透明度效果,我应该使用 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)但是使用该混合函数 glClearColo
搜索 this question 答案的结果,我遇到了一个相当不舒服的发现。 似乎仅以 60 fps 渲染 glClearColor() 会使 iPhone 的渲染利用率达到 27%。 这意味着,几乎
我有一个名为 renderLoop 的方法,它将处理我所有的绘图。当我运行该程序时,出现此异常。这个异常到底是什么以及如何修复它? 当我从此类外部的函数回调(framebuffer_size_call
我开发了一个基于 jupyter notebook 的 api,它似乎在 linux 中运行良好,但在 windows 中我遇到了这个错误,有些人认为这与没有绘制上下文有关,或者当时没有上下文调用了
在应用程序的res/values/colors.xml 文件中,红色定义为#AARRGGBB 格式: #ffff0000 如何将此颜色用作 glClearColor 和其他 OpenGL ES
我是第一次尝试使用 OpenGL。我在网上查看了一些代码,然后尝试编写自己的代码,但我总是得到一个空的(透明的)窗口。 (我是用GLUT开窗的)。 我以为我做错了什么,所以我从here复制了代码到我的
我是一名优秀的程序员,十分优秀!