WSLgでOpenGL4.xを使いたい
WSLgではOpenGL4.xはサポートされていない?
WSLgでOpenGLの描画プログラムを試していたら、OpenGL4.xが使えなかったので色々調べていました。
Windows11ではWSLgというGUIアプリを面倒な設定なしで実行できる環境があるのですが、
こちらのページにある手順を実行するだけだとOpenGL4.xは使えませんでした。
色々調べて使えるようになったので、記事にまとめました。
あくまでOpenGL4.xを使用できる状態にすることが目的なので、OpenGLプログラムやその準備等については触れません。ご容赦ください。
GLFWでCore Profile 4.1を指定して実行したい
GLFWでOpenGL4.1を使いたかったのですが、現状では対応していないので失敗します。
// Core Profile 4.1 を指定
::glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
::glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
::glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
::glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 対応しないバージョンが指定されていると、nullptrが返ってくる
::GLFWwindow* window = ::glfwCreateWindow(0, 0, "sample", nullptr, nullptr);
glxinfo
を使えるようにする
$ sudo apt install mesa-utils
変更前のOpenGLのバージョンを確認
結果はこうでした。
Name | OpenGL Version | Shader Language Version |
---|---|---|
Core Profile | 3.3 | 3.30 |
Compatibility Profile | 3.1 | 1.40 |
ES profile | ES 3.0 | GLSL ES 3.00 |
バージョンのみを表示
$ glxinfo -B | grep "version string"
OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6
OpenGL core profile shading language version string: 3.30
OpenGL version string: 3.1 Mesa 21.2.6
OpenGL shading language version string: 1.40
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
詳細な出力はこんな感じです。
Accelerated: yes
となっています。
$ glxinfo -B
name of display: :0
display: :0 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Microsoft Corporation (0xffffffff)
Device: D3D12 (NVIDIA GeForce RTX 2080 SUPER) (0xffffffff)
Version: 21.2.6
Accelerated: yes
Video memory: 40743MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 3.3
Max compat profile version: 3.1
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.0
OpenGL vendor string: Microsoft Corporation
OpenGL renderer string: D3D12 (NVIDIA GeForce RTX 2080 SUPER)
OpenGL core profile version string: 3.3 (Core Profile) Mesa 21.2.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 3.1 Mesa 21.2.6
OpenGL shading language version string: 1.40
OpenGL context flags: (none)
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 21.2.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00
Mesaの最新版をインストールする
使用できるOpenGLのバージョンを上げるために、Mesaをアップグレードします。
このIssueが参考になりました。
https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers/ からインストールすると良いよと書いてありますが、実行するコマンドとしては以下になります。
$ sudo add-apt-repository ppa:oibaf/graphics-drivers -y
$ sudo apt update
$ sudo apt upgrade -y
DISPLAY環境変数の設定は必要なし
WSLgが使用できる環境であれば、DISPLAY
環境変数の設定は必要ありませんでした。
Mesa3D のレンダラーの切り替え
すらりんさんのブログが参考になりました。
LIBGL_ALWAYS_SOFTWARE
環境変数を定義して、Mesa3Dのレンダラーをllvmpipe
へ変更します。
export LIBGL_ALWAYS_SOFTWARE=1
コマンドプロンプトかPowershellでWSLを再起動します。
> wsl --shutdown
WSLでOpenGLのバージョンを確認します。
Name | OpenGL Version | Shader Language Version |
---|---|---|
Core Profile | 4.5 | 4.50 |
Compatibility Profile | 4.5 | 4.50 |
ES profile | ES 3.2 | GLSL ES 3.20 |
$ glxinfo -B | grep "version string"
OpenGL core profile version string: 4.5 (Core Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL core profile shading language version string: 4.50
OpenGL version string: 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL shading language version string: 4.50
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
詳細は以下の通りで、Accelerated: no
となっています。
$ glxinfo -B
name of display: :0
display: :0 screen: 0
direct rendering: Yes
Extended renderer info (GLX_MESA_query_renderer):
Vendor: Mesa/X.org (0xffffffff)
Device: llvmpipe (LLVM 14.0.5, 256 bits) (0xffffffff)
Version: 22.2.0
Accelerated: no
Video memory: 32064MB
Unified memory: no
Preferred profile: core (0x1)
Max core profile version: 4.5
Max compat profile version: 4.5
Max GLES1 profile version: 1.1
Max GLES[23] profile version: 3.2
OpenGL vendor string: Mesa/X.org
OpenGL renderer string: llvmpipe (LLVM 14.0.5, 256 bits)
OpenGL core profile version string: 4.5 (Core Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL core profile shading language version string: 4.50
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL version string: 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL shading language version string: 4.50
OpenGL context flags: (none)
OpenGL profile mask: compatibility profile
OpenGL ES profile version string: OpenGL ES 3.2 Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
実際に動いているか確認する
glxgears
でOpenGLのバージョンを確認してみると、4.5が使用されていることがわかります。
$ glxgears -info
GL_RENDERER = llvmpipe (LLVM 14.0.5, 256 bits)
GL_VERSION = 4.5 (Compatibility Profile) Mesa 22.2.0-devel (git-e8fc5cc 2022-06-22 focal-oibaf-ppa)
GL_VENDOR = Mesa/X.org
冒頭で書いたプログラムも動作することを確認できました。
以上です。ありがとうございました。
参考
Discussion