Rust(wasm)の速度性能テスト&JavaScriptでゲームループ改

WebAssembly(Rust)の実行速度を簡単な球の物理計算で性能テストしてみました。あと以前作成したゲームループに問題があったため、処理落ちしても大丈夫なように修正、改良しました。
少し古いPC(Windows10)で30FPSを維持できる個数は、Chromeで5000個、Firefox4500個、Edge2500個でした。低価格スマホ、タブレット(android、Chrome)では1000個。

続きを読む Rust(wasm)の速度性能テスト&JavaScriptでゲームループ改

Rust(wasm)⇒WebGL テクスチャファイル読み込み

Rust(wasm)で画像ファイルを読み込み、WebGLに転送、テクスチャポリゴンを表示します。JavaScriptの画像処理は使わずに、Rustで画像のバイナリーデータを解析、必要があればデコードしてWebGLのtexImage2Dへ。GPUが直接扱えるDDS(無圧縮)とATF(DXT+ETC1+PVRTC)、デコードが簡単なTGAの3種類の画像に対応します。

続きを読む Rust(wasm)⇒WebGL テクスチャファイル読み込み

Rust(wasm)⇔JavaScript ファイル読み込みとアニメーション(ゲームループ)

RustでWebGLのプログラムを作っていますが、ファイル読み込み処理が必要になってきました。シェーダーソースコードをRustに埋め込むとエディタで色が変わらない、テクスチャにも対応したい。特殊なサーバー処理なしでファイル操作したいので、JavaScriptのFetch命令でファイル読み込みを実装します。Rust側でできることはRustで実装したいという設計方針のため、比較的簡単な実装、ゲームループでFetchの非同期処理に対応します。ついでにアニメーション処理。RustでPromiseのような処理を実装する知識は……まだない。

続きを読む Rust(wasm)⇔JavaScript ファイル読み込みとアニメーション(ゲームループ)

Rust(wasm)とJavaScript(WebGL)のデータ受け渡し Rust+WebGLでポリゴン描画 (2/2)

前回準備した機能を使って、RustからWebGLのAPIを呼び出して、ポリゴン描画行います。ちょっとした(無駄な)こだわりですがOpenGLに似た記述と仕様を再現しています。それを実現することでRustについての理解が深まったと思います。GL部分だけを見ると、C++のプログラミングをしていると錯覚するかも。今回は、ソースコード2つ(lib.rsとindex.js)と簡単な説明のみです。


続きを読む Rust(wasm)とJavaScript(WebGL)のデータ受け渡し Rust+WebGLでポリゴン描画 (2/2)

Rust(wasm)とJavaScript(WebGL)のデータ受け渡し Rust+WebGLでポリゴン描画 (1/2)

前回の記事はJavaScriptでのWebGLの画面クリアだけだったので、今度はRustによるポリゴン描画を行います。WebGLのAPIを呼び出すだけで簡単できると考えていましたが、データの受け渡しが思った以上に複雑でした。OpenGLの知識があればポリゴン描画自体は難しくないので、主にRust⇔JavaScript間のデータの受け渡し方法について書いていきます。

WebGLについての誤算

WebGLもOpenGLと同じようにバッファやシェーダーなどのリソースを作成した際は、GLuintの整数値(ハンドル)が返ってくると思っていました。違いました。WebGLBufferやWebGLShaderといったオブジェクトが返され、これを使ってGL命令を実行。Rust(wasm)で直接JavaScript側のオブジェクトを管理できない様なので対策が必要です。それと、Rust(wasm)から直接WebGL(WebAPI)は呼び出せないため、JavaScriptを経由する必要があります。

続きを読む Rust(wasm)とJavaScript(WebGL)のデータ受け渡し Rust+WebGLでポリゴン描画 (1/2)

Rust+Wasm+WebGLはじめました 環境構築=>Hello World =>画面クリアまで(Windows10)

Rustというプログラム言語が面白そうなので使い始めてみました。Rustから直接WebAssemblyコードを出力できるので、実行環境はWebブラウザに、グラフィック処理はWebGLを使用します。Webブラウザ上で3Dゲームが作成できるようになることが目標です。それとWebプログラム初心者なので、npm、wasm-bindgenなどのツールやバインダーは使用せず、基本的に手作業で作成していきます。というか使い方がよくわかってないだけですが…… 

今回行うこと Rustの環境作成&ビルド、ブラウザ上で実行、Rust⇔JavaScript間の関数呼び出し、WebGL導入まで

続きを読む Rust+Wasm+WebGLはじめました 環境構築=>Hello World =>画面クリアまで(Windows10)

Bulletでゲームを作ってみるPart3 キャラの移動

前回解説したBulletのコリジョン判定処理を使ってキャラの移動処理を作成します。複雑な状況でも正確で安定したコリジョン判定と移動がストレスにならない良好な操作性が目標です。
判定処理の検証や実験でいくつかキャラ移動処理を試作したので、キャラ移動処理テクニックと合わせて解説していきます。最終的な移動処理は、かなり複雑になってしまったため詳細は省略します。サンプルソースコードにできるだけ解説、問題と解決法など詳しくコメントしているので参考にしてください。


続きを読む Bulletでゲームを作ってみるPart3 キャラの移動

Bulletでゲームを作ってみるPart2 キャラ移動の準備

今回は、Bullet用意されているコリジョン判定を利用してキャラクターの移動処理を作成する準備をします。コリジョン判定を実装するには数学的な知識や特有なテクニックが必要になりますが、Bulletを使えば基礎的な数学知識だけで複雑なコリジョン判定を行うことができます。コリジョン判定関数の解説、使用上の注意など説明していきます。
続きを読む Bulletでゲームを作ってみるPart2 キャラ移動の準備

Bulletでゲームを作ってみるPart1 舞台の準備

物理エンジンといえば、建物を破壊したりリアルな挙動を実現する派手なゲームを思い浮かべますが、その様なゲームでなくても十分物理エンジンを活用可能です。物理エンジンには、形状同士の衝突を検出する機能があり、多数の形状同士の衝突判定を高速に行うことができます。キャラクターの移動、攻撃判定、爆弾、イベントトリガなどを物理エンジンを利用すれば簡単かつ高速に判定することができます。使い方に少しコツがいるため判定処理の方法を中心に説明しながら、簡単な3Dゲームを作っていきます。

続きを読む Bulletでゲームを作ってみるPart1 舞台の準備

DirectX11 DeferredContextによるレンダリング処理の効率化

DirectX11のDeferredContextはマルチスレッドで並列にレンダリング処理(GPUコマンド生成)を行うことでレンダリング処理の時間を短縮する機能です。DeferredContextを使うには少しコツがいるため、使い方を解説をします。ImmediateContextと同じ感覚で使用すると大量のエラーログが出力されて何も描画されません。

続きを読む DirectX11 DeferredContextによるレンダリング処理の効率化

ゲームプログラミングの素