はじめに
Windows のリモートデスクトップでは、OpenGL を有効化するのに制限がありました。 NVIDIA の Quadro シリーズを装着しているPCへのリモートデスクトップでは OpenGL を有効と出来たのですが、 Geforce では有効とすることが出来ませんでした。(以前の話はこちらにあります)
新型コロナウィルスの影響でリモートワークが求められるようになり、 NVIDIA がこの機能を Geforce でも使用できるように機能解放をしてくれました(ありがたや~)。今回はこの手順と簡単な検証をしてみたので、その内容を記事にしました。
結果
リモートデスクトップ接続して、 OpenGL の自作プログラムを実行してみました。これが以下の図ですが、リモートデスクトップでも多くの OpenGL エクステンションが使用可能となっており、ハードウェアアクセラレートが効いたOpenGLが使えることが分かります。
このリモートデスクトップは、 Intel グラフィックスのみを搭載したノートパソコンからデスクトップPCへ接続したときのものです。さらにテッセレーションのサンプルプログラムを実行させてみたものが以下の状態となっています。
ちゃんと動作するようです!
気になった点
リモートデスクトップ(RDP)なので仕方のない点もありますが、操作がネットワーク越しになるので、レスポンスが重要なアプリケーションはこれでも操作が難しそうです。また画質がやや落ちるので、この点も問題になることがありそうです(これについてはさらに記事末尾で実験してみました)。
セットアップ・インストール手順
まず、NVIDIA グラフィックスドライバーをバージョン 440 以降まで更新します。自分が試した状況では、 Game Ready Driver 445.75 を使用しました。
その後、リモートデスクトップで OpenGL を使用可能にするプログラムを NVIDIA のサイトからダウンロードします。これは、 https://developer.nvidia.com/designworks のページの、「Accelerate Windows Remote Desktop」の箇所からファイルがリンクされており、これを使用します。
但しダウンロードするには、NVIDIA の開発者登録( https://developer.nvidia.com/ のアカウント)が必要なようです。
続いてダウンロードしたファイル nvidiaopenglrdp.exe を実行します。実行すると以下のライセンス同意を求められます。
そのまま次へ次へと画面を進めていくと、インストールは完了します。
最後、設定を有効化するためにシステムの再起動を行います。
再起動したら、リモートデスクトップで OpenGL が使用可能となっているはずです。
なお、以下に示すようにOpenGLの拡張が全くとれてこない場合には失敗しています。これではハードウェアアクセラレートが効いたOpenGLは使用できません。どこかの手順がおかしくなっているはずなので、ここに記載した順序でドライバの更新・ソフトウェアの適用を再度行ってください。
GL_VENDOR: Microsoft Corporation
GL_RENDERER: GDI Generic
GL_VERSION: 1.1.0
Extensions:
GL_WIN_swap_hint
GL_EXT_bgra
GL_EXT_paletted_texture
extensionCount = 3
画質の話
先に挙げた画像をよく見ると実はテッセレーションのライン部分で汚いように見えます。これはリモートデスクトップで表示したときにも、そのまま汚い状態でした。 Windows の RDP では利用可能な場合は GPU の H/W エンコーダーを使って画面を圧縮転送するという話があるので、これが原因では?と少し調査したのでその結果を書いておきます。
圧縮コーデックの話
最近の RDP ではサポートしていれば GPU の圧縮コーデックを使うようで、これを無効化してみます。これにはローカルグループポリシーエディタで行います。
ローカルグループポリシーエディターを開いて、以下の階層の場所を開きます。
「コンピューターの構成 / 管理用テンプレート / Windows コンポーネント / リモートデスクトップサービス / リモートデスクトップセッションホスト / リモートセッション環境」
表示された項目のうち、次の2つを無効状態にします。
- リモートデスクトップ接続で H.264/AVC444 グラフィックモードを優先する
- リモートデスクトップ接続用に H.264/AVCハードウェアエンコードを構成する
この設定でもまだラインが汚いので、この点ではないようでした。続いて「RemoteFX アダプティブ グラフィックスの画質を構成する」を変更してみます。この設定を未構成から有効へ切り替え、その時の画質をロスレスへ設定します。これによりようやく画質が改善しました。
このようにして同じ画面を出してみたのが以下のものです。キャプチャの都合でちょっとズレてしまいましたが、設定後のほうは妙なノイズがなく綺麗な画面となっていることが分かるかと思います。(ノイズ以外にも色合いの違いもあるように感じます)
ロスレスにすることで圧倒的に通信量が増えます。そのため回線に負担が掛かるので注意が必要です。自宅や会社の閉じたネットワーク内なら良くても、インターネット(WAN)やVPN接続を使っている場合には、この点が問題になってくることがあるでしょう。
まとめ
ここまで リモートデスクトップで OpenGL が使えるようになり、楽しみながら検証してきました。以前の記事と合わせるとこれで DirectX/OpenGL/Vulkan などはリモートデスクトップ接続時でも初期化して描画が出来るようになりました。
今回ワイヤフレーム描画を見て画質の課題に気付きました。この設定は OpenGL 関係なくリモートデスクトップで画質悪いな、と思っている人には役立つ情報だったのではと思います。
新型コロナウィルスでリモート作業しつつもグラフィックスAPIを触らなきゃいけない人や、DCC ツールなど OpenGL を使っているアプリケーションを使う必要がある人には、このNVIDIAの対応は大変助かるものだと思います。 それ以外でも開発機と動作検証機などPC複数台持っているときにこの機能は嬉しいので、是非有効化されたまま将来にわたって使えるといいな、と思いました。
(現在ドライバ?設定ファイル?にパッチを当てているようなので、いつか GeForce では封印される未来があるかなという雰囲気です)