BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Bash用のOpenGLバインディング

Perl 5の設計と「グルー言語」としてのその適合性について説明した前回の記事で、以前にBash用のOpenGLバインディングを作成したことを述べました。これはおそらく信じられないほどの発言であり、証拠がないので、ハードドライブのほこりっぽい隅に戻って掘り出し、少し更新し、フォントサポートを改善し、ドキュメントを作成して、に公開しました。私のサイトとGitHub。 (実際に体験するには、BashとOpenGLの両方をサポートするシステムが必要ですが、ここにビデオがあります。)

さて、私の告白:私のDeLoreanはPerlを実行しますで説明したDeLoreanダッシュボードのPerlグラフィック OpenGLforBashプロジェクトと履歴を共有します。面白くて皮肉なことに、私は13年前に、Frozen Bubbleを目撃し、誰かがPerlでリアルタイムビデオゲームを書いたことに技術的な感性を傷つけた後、プロジェクトを開始しました。当時、私の第一言語はC ++で、ビデオゲームの目的でOpenGLを勉強していました。私は友達に、それが3DでBashで書かれていたらもっと悪いことはないだろうと宣言しました。アイデアを大声で言いましたが、それは私を怒らせ続けました、そして私は最終的にリアルタイムグラフィックスにPerlを使用することの「ひどい」ことを1つにしようと試みることに決めました。

バッシュの拡張

OpenGLサポートをBashに追加する最も直接的な方法は、ソースコードを変更し、各OpenGL関数をシェル「ビルトイン」として追加することでした。ただし、それを体験できるのは、Bashのカスタムバージョンをインストールすることをいとわない人だけであり、おそらく誰もそれをしたくないでしょう。また、「バッシュのやり方」で物事を行うという精神にも見えませんでした。

次に、各OpenGL関数がパスにインストールされ、OpenGLサーバーに接続するクライアントを呼び出して、その関数を実行するためのメッセージを配信するクライアントサーバーのアイデアを思いつきました。それは喜ばしい「ひどい」解決策だったでしょうが、私が物事をどれほど懸命に最適化したとしても、全体的な目標を達成したとは言えませんでした。

最後に、標準入力でOpenGLコマンドを読み取り、標準出力にユーザー入力イベントを書き込む「OpenGLインタープリター」プロセスを使用する設計に落ち着きました。次に、Bashスクリプトは、パイプに接続されたこのインタープリターを開始できます。各OpenGLコマンドは、パイプに書き込むBash関数である可能性があります。その間、効率のトリックの袋全体を投入し、静的にコンパイルされたハッシュテーブルと赤黒木を使用してプレーンCでインタープリターを作成することにしました。

OpenGL即時モード

OpenGLの詳細は、このプロジェクトがDeLoreanダッシュボードプロジェクトと交差し始める場所です。まず、一歩下がってOpenGLAPIを要約します。

OpenGLは、3D座標とテクスチャの観点からグラフィックスを計画し、そのデータをグラフィックスカードに送信して2D画面にレンダリングするプログラムを作成することを目的としています。非常に単純化するために、ペイントされている画面の領域を説明するために使用する一連の計算と、その領域の各ピクセルの色を説明するための一連の計算があります。

最も一般的な操作は、仮想3D空間で三角形の3つの角を記述し、OpenGLに2D画面のどこに着地するかを認識させ、その領域全体に2D画像を引き伸ばすように指示することです。これは、別の画像と組み合わせたり、変更したりすることもできます。いくつかの明るさの計算によって。プログラムのメインループは、バッファをワイプし、表示されるすべてのポリゴンをプロットして画面に送信することにより、1フレームのビデオを生成します。このスタント全体を16ミリ秒以内に実行すると、毎秒60フレームを維持でき、滑らかなグラフィックを実現できます。

OpenGL APIの起源について権威と話すことはできませんが、ストリーミングのアイデアに基づいて構築されていることは明らかです。おそらくX11ディスプレイプロトコルと互換性があるだけでなく、それが良いアイデアだからです。そのため、各関数呼び出しが操作の結果を示すステータスを返す他のAPIとは対照的に、ほとんどのOpenGL関数には戻り値がありません。 glVertex3f(1,2,3)などのOpenGL関数を視覚化する場合 パイプ上に3つの数値を書き込む印刷ステートメントとして、それが舞台裏でどのように機能するかについてかなり良いアイデアがあります。実際、Bashバインディングの場合、文字通りglVertex 1 2 3と記述します。 glVertex 1 2 3のときにパイプを介して 実行されます。 Bashスクリプトは、グラフィックコマンドが意図したとおりに機能しているかどうかがわからないまま、ブラインドで実行されます。

何年にもわたってOpenGLAPIにいくつかの大きな改訂があり、人々は「保持」モードと「即時」モードについての章全体を本に書いていますが、それはすべて2つの概念に要約されます。

  • フレームごとにパイプを介してすべてのデータを再送信するのは遅いので、もう一方の端にデータの一部をキャッシュしましょう。
  • 組み込みの数学ではすべての人のニーズを満たすことはできないので、自分のカスタム数学を説明する言語を人々に提供しましょう。

とは言うものの、新しいOpenGL APIによって提供されるキャッシングとカスタム計算ははるかに効率的であり、一流のビデオゲームには確かに必要ですが、セットアップと操作(および学習)にも多くの労力を要し、おそらくより多くの害を及ぼします愛好家に良い。高度なグラフィック効果や高精細モデルを実行している場合を除いて、これらも不要です。

したがって、Bash OpenGLバインディングは「非推奨」のAPIのみを処理しますが、教育やいじくり回しの目的でそれを確認することをお勧めします。

ディスプレイリスト

幸い、元のOpenGL APIにはいくつかのキャッシュメカニズムがあり、それらは簡単に使用できます。それらはおおまかに次のシーケンスに沿って機能します:

「OpenGLさん、リモートエンドにオブジェクト37を作成してほしい」

「オブジェクト37を説明するデータがあります」

「次のレンダリング手順でオブジェクト37を使用する」

さらに簡単にするために、Bashバインディングでは、数字の代わりに名前を使用できます。

オブジェクトの最初の主なタイプはテクスチャです。ここでは、2D画像をグラフィックカードにロードし、それを使用してポリゴンを「ペイント」します。 2つ目は「表示リスト」で、一連のOpenGLコマンドを記録し、それらを単一のOpenGLコマンドであるかのように再生します。

ディスプレイリストは、アドホックプロトタイピングに最適です。単純な頂点コマンドを使用して3D(または2D)モデルを表すいくつかの点をプロットし、その点のシーケンスを表示リストとして記録すると、1つのコマンドでそのモデルをレンダリングできるようになります。

この機能の例については、ExamplesディレクトリのRobot.shを確認してください。起動時にロボット本体のセグメントごとに1つの表示リストを作成し、実行中は、ロボットをレンダリングするためにフレームごとに58行のテキストのみを出力します。 Bashは16ミリ秒で58行のテキストを非常に簡単に生成できるため(12年前でも可能)、デモは一般的なハードウェアでフルスピードで実行できました。

ディスプレイリストは、DeLoreanダッシュボードソフトウェアで使用しているPerlグラフィックスに引き継いだ主なトリックです。 Perlの関数呼び出しは、特にOpenGL 1.4のような関数を多用するAPIの場合、Cに比べて少しコストがかかりますが、表示リストにまとめることで、Perlはビデオフレームごとに行う作業が少なくなります。私がBashプロジェクトでこのトリックを学んでいなかったら、Perlプロジェクトはほとんど成功していなかっただろう。

なぜこれを12年前に公開しなかったのですか?

Bashでいくつかの凝ったアニメーションのデモを作成することはできましたが、実際の目標は、それを使用して完全なゲームを作成することでした。古いフライトシムゲームのTerminalVelocityのクローンを目指していて、立方体のフィールドを飛ぶことができる宇宙船まで到達しました(例のFlight.shを参照)が、次の問題は衝突検出でした。 Bashで使用可能なプリミティブは、変数名と配列変数のグローバルな「連想配列」であり(バージョン4には現在、連想配列変数があります)、すべての数学は整数です。固定小数点整数演算で3D行列の回転を実行することはできましたが、衝突検出の実装は大きすぎる障害のように見えました。フォントAPIにも満足できませんでした。これらの問題の解決策を考えている間、プロジェクトは徐々に私のリストから外れました。

これは私が(私が書いたように)「Bashは恐ろしいグルー言語です」と結論付けたところです。このプロジェクトは冗談(または教育ツールかもしれません)として開始および終了しましたが、Perlの同じプログラムスタイルは実際のアプリケーションに非常に役立つことがわかりました。 13年前にFrozenBubbleをもっと真剣に検討していたら、今ではお気に入りの言語であるPerlで有利なスタートを切ることができたかもしれません。

バグ修正以外にこのプロジェクトを強化する予定はありませんが、OpenGLの概念を学びたい人や、自由な時間がたくさんあり、Doomを書きたいという強い願望を持っている人には少なくとも役立つと思いました。 M4でクローンを作成します。

楽しみ!そして、このリンクを転送して楽しんでください。そうしないと、誰もあなたを信じません。


  1. Bashを楽しい方法で学ぶための3つのコマンドラインゲーム

    学習は大変な仕事であり、誰も仕事が好きではありません。つまり、Bashを習得するのがどれほど簡単であっても、それでもあなたにとっては仕事のように感じるかもしれません。もちろん、ゲームを通して学ばない限り。 Bashターミナルの使い方を教えるゲームがたくさんあるとは思わないでしょうし、あなたは正しいでしょう。真面目なPCゲーマーは、Falloutシリーズがボールトに端末ベースのコンピューターを備えていることを知っています。これは、テキストを介してコンピューターとやり取りするという考えを正常化するのに役立ちますが、AlpineやEmacsのようなアプリケーションを備えているにもかかわらず、Fal

  2. PC向けの12の最高のAndroid OS

    私たちの多くは Android OS に夢中になっているため、ほとんどの人が Android OS を複数のデバイス、特にラップトップやデスクトップ PC などのより強力なデバイスで使用することを望んでいます。 Google によって作成された Android オペレーティング システムは、最も頻繁に使用され、好評を博しているオペレーティング システムの 1 つです。主に、スマートフォンやタブレットなどのモバイル デバイス向けに設計されています。特にアプリの作成、ダウンロード、インストールに関しては、非常に多用途で幅広い機能を提供します。大部分の人はおそらく十分に認識しているように、PC 用の