在需要的地方有条件地包括 GLES2

Posted

技术标签:

【中文标题】在需要的地方有条件地包括 GLES2【英文标题】:Conditionally include GLES2 where needed 【发布时间】:2020-10-30 19:18:41 【问题描述】:

我正在尝试使用 glCreateShaderglGetShaderivglDeleteProgram 等函数,但在 Linux 系统上导入 GL/gl.hGL/glext.h 时它们不存在。

这可能是因为它是 2008 年的笔记本电脑,带有集成显卡报告:

2.1 梅萨 20.1.10

和独立卡:

3.0 梅萨 20.1.10

当我导入 GLES2/gl2.h 时,一切正常并且包含问题已解决。

现在我目前至少有一个月无法使用台式计算机或图形标准足够高的计算机 - 我假设这些更好的系统具有包含在标准中的着色器功能GL/gl.h 文件。

如何编写条件导入以仅在需要时才需要 GLES?我不想向 Makefile 添加变量,我希望能够自动检测到这些符号在编译时仅作为 GLES 组件可用的系统,@987654330 @ 序列。

【问题讨论】:

你必须使用像glew或glad这样的OpenGL加载器 @Rabbid76 这可以与 SDL2 一起使用吗? @Rabbid76 好的,我会试试 glew 并报告。 这与sdl无关。 OpenGL (ES) 是一种规范。加载程序使您可以访问图形驱动程序提供的 API 函数。 @Rabbid76 嗯……简单地说,简单。包括 GL/glew.h 并删除所有其他包括已修复它 - 非常感谢。如果您将评论写为答案,我会接受。 【参考方案1】:

您必须使用像 glew 或 glad 这样的 OpenGL 加载程序。 OpenGL (ES) 是一种规范。加载程序使您可以访问图形驱动程序提供的 API 函数。

见OpenGL Loading Library - glad:

const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) 
    std::cout << "SDL could not create context";
    return 1;


if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))

    std::cout << "Failed to initialize OpenGL context" << std::endl;
    return -1;

见Initialize GLEW:

const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) 
    std::cout << "SDL could not create context";
    return 1;


if glewInit() != GLEW_OK

    std::cout << "Failed to initialize GLEW" << std::endl;
    return -1;

【讨论】:

以上是关于在需要的地方有条件地包括 GLES2的主要内容,如果未能解决你的问题,请参考以下文章

如何实现有条件地执行“ui-sref”?

有条件地卸载 Wix 中的先前版本

如何在 laravel 中使用 ajax 有条件地导出 CSV? [复制]

.NET 二进制序列化有条件地没有 ISerializable

错误无法打开包含文件:'GLES2/gl2.h':没有这样的文件或目录突然出现

满足条件时,将多个值一起添加?