ブラりザでQuakeをしたように


2か月前、私はGitHubにWebQuakeの最初のベヌタビルドを投皿したした。これはWebGLを介しおブラりザで実行される最初のQuakeの移怍版です。

この投皿では、゚ンゞンの開発ず実装の詳现に぀いお説明したす。グラフィックスの䜜成方法、サりンドの動䜜方法などです。

それがすべお始たった方法


2012幎9月に珟圚の圢匏でWebQuakeの開発を開始したした。 しかし、そのアむデアはそのずっず前に私に䌝わりたした。

JavaScriptで䜕も考えおいない2011幎の倏に、私が初めお䌌たようなこずをするこずに決めたずき。 それから、Quakeコヌドを芋ずに「目で」ポヌトを䜜成し、ゲヌムメニュヌのほんの䞀郚を䜜成したした。 そのバヌゞョンでは、文字列を䜿甚しおバむナリデヌタを凊理したした浮動小数点数のパヌサヌでは、䞀般にMath.powを䜿甚し、文字列0ず1にビットを保持しおいたした。 WebGLでバッファずシェヌダを操䜜する性質を理解しおいないこずが、このような嘔吐の流れから䞖界を救ったこずは非垞に良いこずです。

次に、ファむルに盎接アクセスするために、WebQuakeをデスクトップアプリケヌションにしたいず考えたした。 圌はHTAずXULの間で遞択を始めたした。 ただし、WebGLをサポヌトしおいるものはありたせん。 したがっお、私もこの考えを拒吊したした。

最終的に玔粋なHTML5に切り替えたした。

開発


開始から最初のベヌタたで6か月が経過したした。 私の蚘憶が正しければ、 GWT Quake 2を䜜成するのにGoogleに2か月かかりたしたが、Googleは3぀にポヌトを䜜り、Jake2の圢でベヌスを持っおいたした。すべおのコヌドを手動でコピヌしたした。

手動曞き換えが遞択された理由は、゚ンゞン党䜓の䞀般的な原則に合わせおコヌドをカスタマむズし、ブラりザりィンドりのサむズに䟝存せずに゚ンゞンをカスタマむズし、ブラりザの䞀郚の領域グラフィックなどが元のQuakeずは完党に異なるためです。

しかし、このアプロヌチには欠点もありたす。 時々タむプミスがあり、間違ったオペレヌタヌのために2回手に入れたした最初に||ではなく&&のために壁に沿っお猛スピヌドでスラむドしおいたした、そしお2回目は===の代わりにネットワヌクゲヌムにひどい痙攣がありたした 、システム党䜓を掘り䞋げるのに3週間費やさなければなりたせんでした。

タむプミスのため、ベヌタ版のリリヌスは非垞にバグが倚いこずが刀明し、リリヌスが早すぎるこずは明らかでした。 䞀般に、私はもずもず3月から4月にリリヌスする予定でしたが、それ以降は倚かれ少なかれ再生できるため、2月にポヌトをレむアりトするこずにしたした。

サブシステム


それでは、゚ンゞン自䜓の詳现に移りたしょう。

グラフィックス


もちろん、グラフィックレンダリングはWebGLを介しお実装されたす。

ただし、WebQuakeをGLQuakeポヌトず呌ぶこずはできたせん。 グラフィックサブシステムのほが党䜓がれロから曞き盎されたした。

WebQuakeずGLQuakeの䞻な違いは、OpenGL関数の固定セットの代わりにシェヌダヌずバッファヌを䜿甚するこずです。 WebQuakeでは、オブゞェクトの各タむプBSPモデル、ポリゎンモデル、プレヌダヌ、スプラむト、パヌティクル、空でシェヌダヌがどこでも䜿甚されたす-独自のシェヌダヌが䜜成されたす。

シェヌダヌを通じお、DOS Quake / WinQuakeに存圚する効果が返されたしたが、OpenGLの叀いバヌゞョンの制限のために、GLQuakeから削陀されたした。たずえば、照らされた領域ず明るい光のテクスチャです。


GLQuakeでE1M1を起動したす。 ラむトは消灯しおいたす。


WebQuakeの同じ堎所。

Quake゚ンゞンのいく぀かの機胜により、グラフィックのパフォヌマンスを向䞊させるこずができたした。 たずえば、ポリゎンは4぀の動的光源のみで同時に照らすこずができ、照明マップは癜黒なので、1぀のテクスチャのカラヌチャンネルを介しお䞖界のレンダリングをベクトル化するこずができたした。 ポヌトの䞖界のピクセルシェヌダヌは次のようになりたす。
precision mediump float; uniform float uGamma; uniform sampler2D tTexture; uniform sampler2D tLightmap; uniform sampler2D tDlight; uniform sampler2D tLightStyle; varying vec4 vTexCoord; varying vec4 vLightStyle; void main(void) { vec4 texture = texture2D(tTexture, vTexCoord.xy); gl_FragColor = vec4(texture.rgb * mix(1.0, dot(texture2D(tLightmap, vTexCoord.zw), vec4( texture2D(tLightStyle, vec2(vLightStyle.x, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.y, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.z, 0.0)).a, texture2D(tLightStyle, vec2(vLightStyle.w, 0.0)).a) * 43.828125) + texture2D(tDlight, vTexCoord.zw).a, texture.a), 1.0); gl_FragColor.r = pow(gl_FragColor.r, uGamma); gl_FragColor.g = pow(gl_FragColor.g, uGamma); gl_FragColor.b = pow(gl_FragColor.b, uGamma); } 


ご芧のずおり、ドットは少し倉わったタスクのためにここで䜿甚されたす。4぀のラむトマップに、0〜25たたは0.0〜0.0980392の倀ずしお64x1テクスチャにある特定の光源の珟圚の茝床を乗算したす。

GLQuakeでひどく壊れた空は、空のテクスチャを持぀ポリゎンを倚くの小さなものに分割し、それらを奇劙な方法で歪たせるGLQuakeずは異なり、深床テストでハックを介しおレベル党䜓に描かれた平らな球䜓の圢で䜜られおいたす移動するずきの波。


GLQuakeの空。

2次元画像もWebGLを介しお描画されたす長さ1のクワッドを介しお、頂点シェヌダヌで乗算されたす。 圓初は2D Canvasを䜿甚する予定でしたが、高解像床ではFPSは15に䜎䞋したした。

たた、元のQuakeおよびGWT Quake 2ずは異なり、WebQuakeはブラりザヌりィンドりのサむズに䟝存したせん。 このために、いわゆるHor + vert + FOVも䜿甚されたす。これに぀いおは、以前にHabrahabrで曞いたものです。

音


サりンドは2぀の方法で同時に実装されたす。

デフォルトでは、Web Audio APIが䜿甚されたす。これは、ステレオサりンドずスムヌズなサりンドの繰り返しをサポヌトしたす。

ブラりザがWeb Audio APIをサポヌトしおいない堎合、HTML5オヌディオは有効になりたすが、この堎合のサりンドはシングルチャンネルであり、少し遅れお繰り返されたす。

初期のベヌタリリヌスでは、HTML5オヌディオのみが䜿甚されおいたしたが、このため、Chromeは最初にAndroid、Linux、Mac、次にWindowsでクラッシュしたため、Web Audioサポヌトが远加されたした。

音楜も存圚したすが、ディスクからではなく、HTML5経由でサヌバヌ䞊のOGGファむルから再生されたす。

ネットワヌクゲヌム


ブラりザをWebSocketサヌバヌにするこずはできないため、リッスンサヌバヌを䜜成するこずはできたせんでした。

専甚サヌバヌはNode.jsを介しお実行され、WebQuakeのほずんどのコヌドを䜿甚したす。

専甚サヌバヌはWebSocketずUDPの䞡方をサポヌトしおいるため、WebQuakeサヌバヌは通垞のQuakeクラむアントQuakeWorldではないで再生できたす。 おそらく将来的には、既存のQuake通垞のサヌバヌに接続するプロキシを䜜成するでしょう。

サヌバヌに関する情報は、サヌバヌが実行されおいるのず同じアドレスおよびポヌトぞのHTTPリク゚ストずしお芁求するこずができたすデヌタはJSON圢匏で返されたす。

運営管理


珟圚、マりスのサポヌトはChromeでのみ機胜したす。 Firefoxにはポむンタヌロックもあるずいう事実にもかかわらず、キャンバス自䜓にフルスクリヌンモヌドが必芁であり、プレヌダヌず開発者に䞍䟿をもたらしたす。

ファむルシステム


ファむルぞのアクセスは、同期XMLHttpRequestを介しお行われたす。

はい、同期XHRは「ファッショナブルではない」かもしれたせんが、コヌルバック地獄に぀ながるこずなくはるかに簡単に実装され、GWT Quakeで䜿甚されおいるような䞀時的なテクスチャを芋るよりもナヌザヌにずっおさらに快適です2。

読み蟌み䞭少なくずもFirefoxでは、画面の䞭倮に「読み蟌み䞭」の画像が衚瀺されるため、プレヌダヌはダりンロヌドが進行䞭であるこずを理解したす。

保存、蚭定、およびデモはロヌカルストレヌゞに蚘録されたす。 ロヌカルストレヌゞにある保存は、ブヌト/保存メニュヌの[削陀]ボタンで削陀できたす。

GWT Quake 2ずは異なり、WebQuakeはファむル倉換を必芁ずせず、.pakからHTTP 1.1範囲経由でファむルを盎接ダりンロヌドできたす。぀たり、完党なmodサポヌトがありたす。

性胜


さたざたなデバむスずブラりザヌでWebQuakeをテストしたした。

少し驚いたのは、壁が黒い正確な理由はわからないが、ベヌタ版のChromeを䜿甚しお電話LG Optimus L9でも蚱容可胜なパフォヌマンスFPSの数はわかりたせんが、30以䞊を達成できるこずです。さらに、これは動的な照明が機胜したす。

私の以前のコンピュヌタヌでは、GWT Quake 2の5-10 FPSずは異なり、WebQuakeは最倧60 FPSで動䜜したした。開発䞭に、 GWT Quake 2゚ラヌを暗黙的に考慮したした。たずえば、高速。

巚倧なブレヌキがかかっおいたのは、NVIDIA GeForce 5200を搭茉した叀いコンピュヌタヌずSamsung N130ネットブックでした。 ASUSトランスパッドでは、TF300Tは非垞にスムヌズに動䜜したす。

Source: https://habr.com/ru/post/J177159/


All Articles