GNU/Linux >> Linux の 問題 >  >> Linux

Linux で OpenGL ES (GLES) 2.0 アプリケーションを開発するにはどうすればよいですか?

メサはそれをサポートします。 OpenGL ES のみに制限したい場合 のみ 次に、別のディレクトリにビルドしてから、適切なインクルード ディレクトリとライブラリ ディレクトリを追加する必要があります。


更新:

(引き続き) PowerVR SDK を使用でき、Vulkan もサポートするようになりました。更新されたリンク:

  • PowerVR SDK ページ:https://www.imgtec.com/developers/powervr-sdk-tools/powervr-sdk/
  • インストーラー ダウンロード ページ:https://www.imgtec.com/developers/powervr-sdk-tools/installers/
  • Github リポジトリ:https://github.com/powervr-graphics/Native_SDK

私の最初の回答の時点では、PowerVR SDK が最も完全なソリューションでした (Wikipedia のページによると、Mesa は 3.1 リリースで OpenGL ES 2.0 を完全にサポートしています)。

現在、Mesa と Mali SDK も選択できます。それらの詳細については、Ciro Santilli 冠状病毒审查六四事件法轮功によるこの詳細な回答を参照してください

元の回答:

POWERVR SDK を使用して、PC で OpenGL をエミュレートできます。 SDK はこちらからダウンロードできます。このアーカイブには、エミュレーション ライブラリをドキュメント ファイルとしてインストールするために必要な手順が記載されており、ソース コード付きのチュートリアルとデモ アプリケーションが含まれています。


GLFW、メサ、Ubuntu 16.04 AMD64

これは、Ubuntu 14.04 でのセットアップは簡単ではありませんでしたが、今では問題なく機能します。

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

出力:

glfw_triangle.c

#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 の多くと同様) で記述されているようで、-lGL でコンパイルされます。 #define GLFW_INCLUDE_ES2 を削除すると .

即時レンダリング glBegin など、GLES にないものを追加すると、 、リンクは期待どおりに失敗します。

参照:https://askubuntu.com/questions/244133/how-do-i-get-egl-and-opengles-libraries-for-ubuntu-running-on-virtualbox

クレジット:genpfult はコードをより正確にしました。

ARM マリ OpenGL ES SDK

  • ダウンロード:http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/
  • ドキュメントの HTML をブラウザで開く
  • 「クイック スタート ガイド」に従ってください。簡単です

いくつかの興味深いオープン ソースの例とウィンドウ システムのボイラープレート (X11 + EGL) が含まれています。

ビルド システムは ARM / Mali SoC の簡単なクロス コンパイルをサポートしていますが、まだテストしていません。

含まれている重要なコンポーネントは、「OpenGL ES 3.2 API 呼び出しを OpenGL API にマップする」「OpenGL ES エミュレーター」http://malideveloper.arm.com/resources/tools/opengl-es-emulator/ のようです。しかし、それはソースと共に出荷されず、プリコンパイルされているだけです.

寛容に見える独自のエンタープライズ EULA を使用していますが、弁護士に相談してください。

SDK v2.4.4 でテスト済み。


Linux
  1. LinuxでBusyBoxを使用する方法

  2. Linux用のPythonアプリケーションをパッケージ化する方法

  3. Linuxでcronを使用する方法

  1. LinuxにPythonをインストールする方法

  2. LinuxにJavaをインストールする方法

  3. Linuxでディスクをパーティション分割する方法

  1. Linuxでアプリケーションの起動時間を改善する方法

  2. Linux で起動アプリケーションを遅延して起動する方法

  3. C++ を使用して Linux でウィンドウを作成するにはどうすればよいですか?