【问题标题】:Any GLES examples, in C++, on x86 Linux?x86 Linux 上的任何 GLES 示例,用 C++ 编写吗?
【发布时间】:2012-08-20 21:30:18
【问题描述】:

我正在寻找一个很好的 GLES2 示例资源,用于在带有 Xorg 的 x86 Linux 上的 C++(或 C)。 我能找到的示例都在 iOS 的 Objective C、Android 的 Java 或 WebGL 的 JavaScript 中。 Kronos 网站有一个“教程”部分,其中包含两行“我们的教程索引将放在此处”。鉴于 GLES2 已经 5 年了,我对那里突然涌现的内容不抱太大希望。

我已经非常了解 OpenGL。我只是想要一些方便的来源来复制和粘贴上下文设置代码,真的。我在哪里可以找到类似的东西?

【问题讨论】:

    标签: linux opengl-es opengl-es-2.0 xorg


    【解决方案1】:
    【解决方案2】:

    GLFW、Mesa、Ubuntu 16.04 AMD64

    我不确定 GLUT 是否支持 GLES,但GLFW does,大大简化了窗口管理。

    sudo apt-get install libglfw3-dev libgles2-mesa-dev
    gcc glfw_triangle.c -lGLESv2 -lglfw
    

    输出:

    来源:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define GLFW_INCLUDE_ES2
    #include <GLFW/glfw3.h>
    
    static const GLuint WIDTH = 800;
    static const GLuint HEIGHT = 600;
    static const GLchar* vertex_shader_source =
        "#version 100\n"
        "attribute vec3 position;\n"
        "void main() {\n"
        "   gl_Position = vec4(position, 1.0);\n"
        "}\n";
    static const GLchar* fragment_shader_source =
        "#version 100\n"
        "void main() {\n"
        "   gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
        "}\n";
    static const GLfloat vertices[] = {
            0.0f,  0.5f, 0.0f,
            0.5f, -0.5f, 0.0f,
        -0.5f, -0.5f, 0.0f,
    };
    
    GLint common_get_shader_program(const char *vertex_shader_source, const char *fragment_shader_source) {
        enum Consts {INFOLOG_LEN = 512};
        GLchar infoLog[INFOLOG_LEN];
        GLint fragment_shader;
        GLint shader_program;
        GLint success;
        GLint vertex_shader;
    
        /* Vertex shader */
        vertex_shader = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vertex_shader, 1, &vertex_shader_source, NULL);
        glCompileShader(vertex_shader);
        glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
        if (!success) {
            glGetShaderInfoLog(vertex_shader, INFOLOG_LEN, NULL, infoLog);
            printf("ERROR::SHADER::VERTEX::COMPILATION_FAILED\n%s\n", infoLog);
        }
    
        /* Fragment shader */
        fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fragment_shader, 1, &fragment_shader_source, NULL);
        glCompileShader(fragment_shader);
        glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
        if (!success) {
            glGetShaderInfoLog(fragment_shader, INFOLOG_LEN, NULL, infoLog);
            printf("ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n%s\n", infoLog);
        }
    
        /* Link shaders */
        shader_program = glCreateProgram();
        glAttachShader(shader_program, vertex_shader);
        glAttachShader(shader_program, fragment_shader);
        glLinkProgram(shader_program);
        glGetProgramiv(shader_program, GL_LINK_STATUS, &success);
        if (!success) {
            glGetProgramInfoLog(shader_program, INFOLOG_LEN, NULL, infoLog);
            printf("ERROR::SHADER::PROGRAM::LINKING_FAILED\n%s\n", infoLog);
        }
    
        glDeleteShader(vertex_shader);
        glDeleteShader(fragment_shader);
        return shader_program;
    }
    
    int main(void) {
        GLuint shader_program, vbo;
        GLint pos;
        GLFWwindow* window;
    
        glfwInit();
        glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
        window = glfwCreateWindow(WIDTH, HEIGHT, __FILE__, NULL, NULL);
        glfwMakeContextCurrent(window);
    
        printf("GL_VERSION  : %s\n", glGetString(GL_VERSION) );
        printf("GL_RENDERER : %s\n", glGetString(GL_RENDERER) );
    
        shader_program = common_get_shader_program(vertex_shader_source, fragment_shader_source);
        pos = glGetAttribLocation(shader_program, "position");
    
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glViewport(0, 0, WIDTH, HEIGHT);
    
        glGenBuffers(1, &vbo);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
        glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 0, (GLvoid*)0);
        glEnableVertexAttribArray(pos);
        glBindBuffer(GL_ARRAY_BUFFER, 0);
    
        while (!glfwWindowShouldClose(window)) {
            glfwPollEvents();
            glClear(GL_COLOR_BUFFER_BIT);
            glUseProgram(shader_program);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            glfwSwapBuffers(window);
        }
        glDeleteBuffers(1, &vbo);
        glfwTerminate();
        return EXIT_SUCCESS;
    }
    

    代码的关键行是:

    #define GLFW_INCLUDE_ES2
    #include <GLFW/glfw3.h>
    

    GLFW_INCLUDE_ES2 记录在:http://www.glfw.org/docs/latest/build_guide.html#build_macros 并且快速查看源代码表明它转发给 GLES:

     #elif defined(GLFW_INCLUDE_ES2)
      #include <GLES2/gl2.h>
      #if defined(GLFW_INCLUDE_GLEXT)
       #include <GLES2/gl2ext.h>
      #endif
    

    这个源似乎是 GLES 和 OpenGL 的公共子集(就像 GLES 的大部分一样),如果我们删除 #define GLFW_INCLUDE_ES2,也可以使用 -lGL 编译。

    如果我们添加 GLES 中没有的内容,例如立即渲染 glBegin,链接会按预期失败。

    另见:How to develop OpenGL ES (GLES) 2.0 applications on Linux?

    致谢:genpfult 使代码更加正确。

    ARM Mali OpenGL ES SDK

    包含几个有趣的开源示例 + 窗口系统样板 (X11 + EGL)。

    构建系统支持 ARM / Mali SoC 的轻松交叉编译,但我尚未对此进行测试。

    包含的关键组件似乎是“OpenGL ES Emulator”http://malideveloper.arm.com/resources/tools/opengl-es-emulator/,它“将 OpenGL ES 3.2 API 调用映射到 OpenGL API”。但这不附带源代码,仅预编译。

    使用似乎是允许的自定义企业 EULA,但是是的,请咨询您的律师。

    在 SDK v2.4.4 上测试。

    【讨论】:

    • Grrr,这需要 x86 Linux 和 Mali(或模拟器),但如果你使用 arm64 Linux,你会被淹没。我主要运行手臂机器,有些使用 Malis。 10 年没有窗户。所以他们不想发布他们的源代码,他们只有 x86 二进制文件。这让我试图从 install.sh 文件中提取一些东西,完全倒退。运行 install.sh --help > somefile.txt,有几个选项。我只想做裸机,用 gcc 编译,它带有 Eclipse 和大量的东西。
    • @AlanCorey 很酷,所以你在没有 GLES 的情况下运行 ARM 机器?服务器机器还是神话般的 ARM 桌面?
    • 不是服务器或神话。我有几个树莓派,我最新的是一个 Odroid N2。我有几台旧笔记本电脑,但主要是在 Pi 或 Odroid 上。我花了 2 天的大部分时间寻找有关在 Linux 下从 C 语言执行 OpenGL ES 的编程示例或教程。一切近在咫尺的东西最终都会回到从 Windows 上做的事情。并不是说我知道 OpenGL ES。有 Raspberry Pi 示例,但它们是非标准的,不能在其他任何东西上运行。我现在有 2 台带 Malis 的手臂机器,我想学习如何使用它们。
    • @AlanCorey 我明白了。希望 Vulkan 将被所有人采用,并且有人会在 Vulkan 中实现 GLES。 ARM is hiring BTW,如果你想尝试改进他们的设置。
    • 我没有资格,我已经 65 岁了。这看起来更接近 developer.arm.com/tools-and-software/embedded/…。可能很荒谬,我想做一个 SDR 瀑布和频谱,但使用 GPU 负责更新显示杂务。我探索了一些 CPU 方法,但即使直接写入帧缓冲区,更新显示也很昂贵。其他我对OpenGL不太感兴趣的。一个叫 Peter Onion 的人已经做了 SDR 的事情,使用旋转纹理来滚动瀑布。在 RPI 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多