以gtkmm为单位连续渲染Gtk::GLArea



我用了一个gtkmm4+opengl的例子,窗口加载和显示没有任何错误,并渲染了一帧,但似乎忽略了我的queue_render((和queue_draw((调用,控制台中的print语句证明了这一点。我也将自动渲染设置为true。

#include <iostream>
#include <string>
#include <gtkmm.h>
#include <giomm/resource.h>
#define GLEW_STATIC
#include <gl/glew.h>
class TestWindow : public Gtk::Window {
protected:
Gtk::GLArea mGlArea;
void onRealize() {
std::cout << "onRealize()" << std::endl;
mGlArea.make_current();
glewExperimental = true;
if (glewInit() != GLEW_OK) {
std::cout << "ERROR: Failed to initialize GLEW" << std::endl;
}
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
void onUnrealize() {
}
bool onRender(const Glib::RefPtr<Gdk::GLContext>& context) {
std::cout << "onRender()" << std::endl;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
mGlArea.queue_render();
mGlArea.queue_draw();
return true;
}
public:
TestWindow() {
set_title("Window Title");
set_child(mGlArea);
mGlArea.set_auto_render(true);
mGlArea.set_size_request(800, 600);
mGlArea.set_required_version(4, 0);
mGlArea.signal_realize().connect(sigc::mem_fun(*this, &TestWindow::onRealize));
mGlArea.signal_unrealize().connect(sigc::mem_fun(*this, &TestWindow::onUnrealize), false);
mGlArea.signal_render().connect(sigc::mem_fun(*this, &TestWindow::onRender), false);
mGlArea.show();
}
};
int main(int argc, char* argv[]) {
auto app = Gtk::Application::create("test.gtkmm");
return app->make_window_and_run<TestWindow>(argc, argv);
}

我也面临着gtkmm-4.0与OpenGL上下文的问题。不幸的是,我还没有进行任何OpenGL开发,所以我真的不明白发生了什么。

您可能遇到了此问题:https://gitlab.gnome.org/GNOME/gtk/-/issues/4950.我在我的NVidia GPU机器上对你的代码进行了一些测试,我可以确认GDK_DEBUG=gl-glx没有产生错误。

虽然我不知道glewInit()不工作的含义,因为即使删除了init,应用程序仍然运行并设置颜色等。

相关内容

  • 没有找到相关文章

最新更新