簡體   English   中英

SFML 2.5.1 - 不支持幾何着色器,Ubuntu 22.04,NVIDIA GeForce RTX Mobile

[英]SFML 2.5.1 - Geometry shaders are not supported, Ubuntu 22.04, NVIDIA GeForce RTX Mobile

換操作系統后,無法再使用SFML幾何着色器,總是報如下錯誤:

Failed to create a shader: your system doesn't support geometry shaders 
(you should test Shader::isGeometryAvailable() before trying to use geometry shader

奇怪的是,用於檢查系統是否完全支持着色器的isAvailable() function 返回true ,讓我認為我的系統確實不支持幾何着色器。

雖然我知道我的系統支持這種着色器。 為了證明這一點,可以鍵入命令glxinfo並搜索某種幾何着色器。 如果無法識別該命令,您可以使用以下命令安裝它:

$ sudo apt-get install mesa-utils

最后,當我 grep 諸如“幾何”之類的信息時,我得到以下 output。

$ glxinfo | grep geometry
GL_EXT_float_blend, GL_EXT_frag_depth, GL_EXT_geometry_point_size, 
GL_EXT_geometry_shader, GL_EXT_gpu_shader5, GL_EXT_map_buffer_range, 
GL_OES_geometry_point_size, GL_OES_geometry_shader,

在這里你可以看到我的系統確實支持幾何着色器並且沒有驅動程序錯誤或未安裝的東西,因為我的 Ubuntu 驅動程序已經全部是最新的:

$ ubuntu-drivers autoinstall
All the available drivers are already installed.

所以它一定確實是一個 SFML 2.5.1 問題,因為其他人如。 @mabel 偶然發現了這個問題。

我發現的最終解決方法確實是一個錯誤,或者更確切地說是與 SFML 2.5.1 的向上兼容性問題。 如上所述, glxinfo僅返回幾何着色器GL_EXT_gpu_shader5

版本很重要,因為在位於src/SFML/Graphics/Shader.cpp的文件中的 SFML 着色器代碼中,可以觀察到以下代碼片段:

bool Shader::isGeometryAvailable()
{
    std::lock_guard lock(isAvailableMutex);

    static bool checked   = false;
    static bool available = false;

    if (!checked)
    {
        checked = true;

        TransientContextLock contextLock;

        // Make sure that extensions are initialized
        sf::priv::ensureExtensionsInit();

        available = isAvailable() && (GLEXT_geometry_shader4 || GLEXT_GL_VERSION_3_2);
    }

    return available;
}

這里可以清楚的看到,只勾選了GLEXT_geometry_shader4GLEXT_GL_VERSION_3_2的宏。 因此,根本沒有檢查我使用的幾何着色器版本, function 最終返回false ,導致程序在以下代碼片段中退出:

// Make sure we can use geometry shaders
if (geometryShaderCode && !isGeometryAvailable())
{
  err() << "Failed to create a shader: your system doesn't support geometry shaders "
        << "(you should test Shader::isGeometryAvailable() before trying to use geometry shaders)" << std::endl;
  return false;
}

最后,我刪除了檢查幾何着色器是否可用的行的最后一部分,結果是:

available = isAvailable();

注意力! 這只是我剛剛發現並想與您分享的解決方法。 這不是一個通用的解決方案,如果您的系統真的不支持幾何着色器,它可能會給您帶來麻煩。

更改這行代碼后,我使用 CMake 為自己重新創建了 SFML。所以非常正常的過程:

$ cmake -S . -B build/ -D CMAKE_BUILD_TYPE=Release
$ cmake --build build/
$ sudo cmake --install build/

然后終於可以將 SFML 庫鏈接到我的可執行文件而不會出現上述錯誤。 為了進一步使用,這應該是一個更新,使僅使用GL_EXT_gpu_shader5的系統與 SFML 兼容。

暫無
暫無

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

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