簡體   English   中英

GTKmm Opengl 上下文未初始化

[英]GTKmm Opengl context not initialized

我正在嘗試在 GTKmm 中創建一個視頻播放器,為此我使用mpv 文檔說,我可以使用 OpenGL 視圖嵌入視頻播放器。 但是,我在 GTKmm 應用程序中實現播放器時遇到了困難。

我有一個 GLWindow,它包含一個 GLArea,它應該包含視頻播放器。 問題是,當我嘗試初始化 mpv 渲染上下文時,出現錯誤,告訴我 OpenGL 未初始化。

以下是我的主窗口的構造函數:

    GLWindow::GLWindow(): GLArea_{}
    {
        set_title("GL Area");
        set_default_size(400, 600);
        setlocale(LC_NUMERIC, "C");

        VBox_.property_margin() = 12;
        VBox_.set_spacing(6);
        add(VBox_);

        GLArea_.set_hexpand(true);
        GLArea_.set_vexpand(true);
        GLArea_.set_auto_render(true);
        GLArea_.set_required_version(4, 0);
        VBox_.add(GLArea_);

        mpv = mpv_create();
        if (!mpv)
            throw std::runtime_error("Unable to create mpv context");

        mpv_set_option_string(mpv, "terminal", "yes");
        mpv_set_option_string(mpv, "msg-level", "all=v");
        if (mpv_initialize(mpv) < 0)
            throw std::runtime_error("could not initialize mpv context");
        mpv_render_param params[] = {
                {MPV_RENDER_PARAM_API_TYPE, const_cast<char*>(MPV_RENDER_API_TYPE_OPENGL)},
                {MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, static_cast<void*>(new (mpv_opengl_init_params){
                        .get_proc_address = get_proc_address,
                })},
                {MPV_RENDER_PARAM_INVALID}
        };
        if (mpv_render_context_create(&mpv_gl, mpv, params) < 0)
            throw std::runtime_error("Failed to create render context");

        mpv_render_context_set_update_callback(mpv_gl, GLWindow::onUpdate, this);

    }

據我所知,這應該只是初始化視頻播放器視圖,但是當我嘗試使用mpv_render_context_create創建渲染上下文時mpv_render_context_create 我在該行收到以下錯誤:

[libmpv_render] glGetString(GL_VERSION) 返回 NULL。
[libmpv_render] OpenGL 未初始化。

然后應用程序以SIGSEGV信號終止。

問題可能來自我的get_proc_address函數,目前我只為 linux 實現了它,它看起來像下面這樣:

static void *get_proc_address(void *ctx, const char *name) {
    return (void *)glXGetProcAddress(reinterpret_cast<const GLubyte *>(name));
}

老實說,我對為什么沒有創建 OpenGL 上下文感到不知所措。 我該如何調整我的 GTKmm 應用程序以允許 mpv 視頻播放器正確初始化?

正如錯誤所暗示的那樣,問題在於沒有 OpenGL 上下文。 GLArea 不是立即創建的,當創建 OpenGL 視圖時,GLArea 上有一個事件signal_realize 我不得不聽那個事件,並在設置GLArea.make_current()之后在那里初始化 mpv 變量,將 GLArea 的上下文設置為我們想要連接到 mpv 的上下文

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM