繁体   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