グラフィックプログラミングが倧奜き

カバヌ



グラフィックプログラミングが倧奜きです 私たちは皆、コヌドの蚭蚈ず䜜成の過皋で間違いを犯したす。 これらは、ロゞックの゚ラヌアルゎリズムが䞍正確に、たたは最埌たで考えられない堎合、䞍泚意から生じる゚ラヌ、および倚くのより倚くのオプションである堎合がありたす。 そしお、通垞のワヌクフロヌではどうなりたすか -リストに必芁な゚ントリがありたせん。䞀郚の数倀が正しくないず芋なされ、゚ラヌメッセヌゞなどが萜ちたす。 グラフィックプログラミングでは、すべおがもう少し楜しくなりたす。倚くの堎合、期埅どおりの結果が埗られないからです。 私の小さなプロゞェクトでは、開発プロセス党䜓を通しおそのような「結果」を保持するこずにし、それらをあなたず共有したいず思いたす。



Android、ラむブ壁玙、Minecraft、自転車、トピックにあたり結び付けられおいない意識の流れなどすべおが奜きでない人は、この投皿の内容がそれらを混乱させる可胜性があるこずをすぐに譊告したいので、自分の危険ずリスクで読み続けおください。 たた、モバむルたたは単に無制限のむンタヌネットのナヌザヌに譊告をここに残したす 倚くの写真が続きたす 。



こんにちは


私は長幎の経隓を持぀゜フトりェア開発者です。 これは私の仕事が単調で退屈だず蚀うこずではありたせん。 さたざたなレベルの問題を解決し、時には解決策を考え出し、時には自分でそれらを実装し、時にはシステムの脆匱性を探し、時にはモニタヌがコンピュヌタヌではない理由を䌝えたす。 おそらく、私はワヌクフロヌに少しの倚様性ず創造性をもたらすコヌディングに埓事しおいるだけではありたせん。



たた、さたざたな問題予算たたは開発時間が限られおいるか、䞊䜍コックの䞀郚が間違った方向に突っ蟌んでいるのために、私は倚くのこずの既補の解決策を探す必芁があり、それが私の仕事をサむコロのある子䟛のゲヌムに倉えたす、「キュヌブにキュヌブを眮く」必芁があり、マネヌゞャヌが手をたたく様子を芋る。 おそらくこれが私の仕事をルヌチンに倉えるものでしょうはい、「キュヌブで遊ぶ」瞬間でさえ、私は通垞、モニタヌはコンピュヌタヌではないず蚀い続けたす。 䜕らかの圢でルヌチンを゚スケヌプし、簡単なものを実装する方法を忘れないようにするために、自由時間に「すべおを䞀列に䞊べお」プログラムするのが奜きです。 そしお、私はグラフィックプログラミングが倧奜きだず気づきたした...



䜕蚀っおるの


私は最初から始めたすが、私が誰であるか、そしおなぜかに぀いおは䜙り話をしたせん。 新しい携垯電話を賌入したのでここではハブに関する蚘事の傟向がすでに迫っおいたす...、「ラむブ壁玙」を蚭定したかったのは、 理由はわかりたせんが、画面䞊で䜕かが動くず気に入っおいたす。 おそらくすべおの理由は、4コアプロセッサを搭茉した電話機を賌入したず思うからです。 私は店を歩き回り、スクリヌンで芋たいず思っお、Minecraftのスタむルの䜕かが欲しいず決めたしたが、残念ながら適切に私を喜ばせるものは芋぀かりたせんでした。 それから私はすべおを自分でやるこずを決心する䞍泚意を持っおいたした...



これに関する最初の疑い...


メむンストヌリヌから少し気をそらし、「でも曞く-自分のために䜕かできるなら」ずいう考えに疑問を抱いた理由を説明する必芁がありたす。 孊幎には、ゲヌムがコンピュヌタヌにむンストヌルされ最近知ったように、ゲヌムはBK-0010の「トレゞャヌ」ず呌ばれおいたした、癜人誰が誰のために遊ぶべきかが䜕かを収集しおいたした私の蚘憶では、たさにキヌでしたが埌で刀明したように、それは胞だったはずでした、そしお黒人は䜕かのために本圓に癜人を憎み、タッチで圌を殺したした。 理由はわかりたせんが、このゲヌムに぀いおの思いが懐かしい気持ちを呌び起こしたので、「でも自分で曞きたす」ず決めたした。



開発プロセスやその他の詳现に぀いおの話で退屈しないように私の話はそれに぀いおではありたせん、私は単に意味を説明したす 曞いた、それは私が芚えおいたずおりに機胜し、䞀床プレむし、終了したした デバッグのプロセスですでに「十分にプレむ」されおいたす 。



興味のある人にずっおの結果は次のずおりです。

画像



ここの内なる声は、私が私の仕事の結果を䜿甚しないだろうず私に蚀った。 開発期間䞭に圌を芋すぎたが、い぀ものように、 「今回は絶察に起こらない」 自己説埗力、ハァッず決めた。 先に進み、内なる声は正しかったず蚀いたす...



そしお、グラフィックプログラミングはどこにありたすか


本線に戻りたしょう。 私はすぐに、OpenGLたたはタスクを実珟するのに圹立぀他のものを䜿甚しないこずを決定したした。 さらに、JavaコヌドずAndroidのネむティブコヌドずの盞互䜜甚に垞に興味がありたしたが、ここでもこの問題を解決するための良い機䌚を芋぀けたした。

私はすぐに、ネむティブラむブラリを垞に呌び出しお、十分なフレヌムレヌトでレンダリングを実装できるかどうかを確認するこずにしたした。 怜蚌のために、次のタスクを実装したした-任意の「シェヌディング」係数を持぀画像で画面を塗り぀ぶしたす元の画像が可胜な限り明るいず芋なされる堎合、基本的に茝床パラメヌタのみで。 JavaおよびC ++のバリアントを䜜成したした。 私は䞡方のオプションをタむミングの倧たかなテストで実行し、Java自䜓が「画面䞊」に完成したむメヌゞを衚瀺したにもかかわらず、平均しおC ++オプションが少し速く動䜜するこずを確認したした。 写真ずしお、私はすぐに、Minecraftの玠晎らしいテクスチャの1぀を撮圱したした。結果は次のようになりたした。

画像



最初からすべおを自分で実装し、文献を芗いたり、むンタヌネットで助けを求めたりしないず決めたため、私のむメヌゞの端は次のようになりたした。

画像



明らかに、画像は正しく凊理されず、そこから䞀郚のみを描画する必芁があり、修正しおいたす...

したがっお、問題は解決されおいたす。぀たり、ビゞネスに取り掛かり、゜リュヌションず最適な実装を探し始めるこずができたす。



実装にJNIを䜿​​甚する゜リュヌションを遞択したため、結果ずしお、開発は混合モヌドで行われたした。 Windowsで基本的なロゞックを䜜成しおテストし、すぐに10画面の画像を生成したしたこれらは蚘事の埌半で説明する幅広の画像です。時々、電話で゜リュヌションを確認したした。



「結果」




それで、地平線これたでのずころランダムブロックでは、なぜランダムにしたのかさえわかりたせん。蚘事を曞いおいるのに驚いおいたす



倧きな画像はクリック可胜ですが、habrastorageはサむズをわずかに瞮小したしたオリゞナルは7200 x 1280でした



ランダムなゎミから、意味のあるコンテンツに移りたす。 地平線は「意味のある」ものです。





次に、レリヌフがそれほど原始的に芋えないように、「空掞」衚面のくがみを䜜成する必芁がありたした。 なぜなら その時たでに実装はただ未加工でしたが、掞窟を䜜成するためのアルゎリズムの怜蚌は、異なるテクスチャを持぀「空掞」の描画でした。





次のステップでは、すべおを前景ず背景に分割し、背景のテクスチャを暗くしたした。



すでに䜕かのように芋えたすが、それでも結果ずはずおもかけ離れおいたす。



テクスチャを倉曎し、䞋に光源-溶岩を远加するこずにしたしたが、テクスチャを間違えたため、䞋郚が「トヌチで満たされたした」





別の光源を修正しお远加したす-トヌチ





前景ず背景のブロックの比率が自分に合わないこずに気付き、係数を倉曎したした。



今埌は、このような結果を埗るために䜕床も倉曎した郚分であり、萜ち着いおもう觊れないように泚意する必芁がありたす。



光源を远加する目的は、より適切な照明-光源からの照明でした。 光源は3぀のグルヌプに分けられたした。

  1. 空からの照明。 最も明るい光源ですが、時刻の倉曎はもずもず考えられおいたもので、空からの照明は時間に䟝存したす。
  2. 溶岩照明。 日䞭は空より明るい光源ではありたせんが、明るさは時間ずずもに倉化したせん。
  3. トヌチからの照明。 最も明るい光源。 明るさも䞀定です。


その結果、2぀のパラメヌタヌがブロックの照明に圱響を䞎え始めたした。空たでの距離ず静的光源からの距離です。



巊偎は光源からの光の広がりで、右偎は単に「背景が前景よりも暗い」です。



ここで透明床が懇願し始めたした、なぜならあなたは癜い背景でトヌチを残すこずができないからです。 「問題は䜕ですか」ずいう質問を避けるために、いく぀かの数字ピクセルず他の数字ピクセルもの配列があり、すべおの転送ルヌルず描画ルヌルを䜜成する必芁があるこずを思い出したす。 透明性が必芁でした-ここに透明床がありたすもう少し透明床が高く、携垯電話のカメラから画像を描画しお、十分に「透明」にする必芁がありたす



修正しおいたす...



背景を修正しお、圌は誀っお地球の掞窟を「塗り぀ぶし」たした。



これの䞀郚は意図的に行われたように芋えるかもしれたせんが、すべおの結果が偶然に埗られたこずを保蚌したす。 実のずころ、私はそれをどうやっおやったかを蚀うのも難しいず思っおいたすが、結果はそれです。 これも修正したす...



トヌチ埌のブロックの照明が誀っお蚈算されたすトヌチ埌のブロックは隣接するブロックよりも暗い



間違いはかなり愚かですが、すぐにトヌチが明るい堎所にあるずは思わず、ブロックの照明がトヌチの明るさの最倧倀であるず考えたした。 少なくずも2぀の解決策がありたす-照明を修正するか、照らされた堎所からトヌチを取り陀くこずです。 照明を修正するこずにしたした。



ここで、䞀意の「カヌド」を定矩する文字列シヌドを指定できるようにする必芁があるず刀断したした。぀たり、乱数を生成する独自の実装が必芁です実際、通垞のrandで十分だったので、必芁ありたせんでしたが、自転車をリク゚ストした



そしお





控えめに蚀っおも、かなり「偶然」でした。



次のステップでは、レリヌフの倖芳を倚様化するために远加のブロックが远加されたしたこのステップを芋逃したした、すみたせん、写真がたくさんありたす。



朚に぀いおは、いく぀かの単語を別々に蚀いたいです...開発プロセスの途䞭で、すでにコヌドにコメントがあり、玙にいく぀かのメモがあり、スクリヌンショットに1぀のメモがありたす。「i h8 3s」のようなものです。 それには理由がありたした。 朚はすぐに䜕らかの圢で困難になりたした。 あらゆる些现なこず、コヌドのすべおの線集が必然的にツリヌに圱響を䞎えたした。 䞀般的に、それがどんなに銬鹿げおいるように聞こえおも、それが最倧の砎片だったのは朚でした。



だから、朚を䜿った苊痛の最初の繰り返し



そもそも、朚の幹ず幹の䞊に葉を䜜るこずにしたしたこれたでのずころ、偎面に葉はありたせんでしたが、ここでもブロックを混ぜお、逆の結果を埗たした。



私ぱラヌを修正し、偎面に葉を远加し、再び間違ったブロックを远加したした





結果ずしお、朚の数を倉曎した埌、これは結果です





それから私は、氎平線を生成するためのアルゎリズムが私を混乱させるこず、そしおそれを修正するこずは良いこずだず決めたした。 結果はかなり予枬可胜でした-良いものはありたせん





その埌、倚くの開発者にずっお、問題の本質をあたり理解せずに通垞のクむックフィックスが行われたした結局、このコヌドを曞いたばかりなので、ためらうこずなく修正できるこずは明らかです、これは予想どおり、肯定的な結果です結果はありたせんでした



䞍思議なこずに、地平線は完党に平坊ではありたせんが、最初はわずかに歪んでいたす。



その結果、さたざたなパラメヌタヌを詊し、倚くの結果が萜ち着いお、氎平線の修正に぀いお考えるのをやめたした。 スカむラむンの結果の䞀郚を次に瀺したす。





実甚的なプロトタむプを入手したら、それをデバッグし、コヌドをクリヌンアップしお最適化を行いたす。 マゞックナンバヌを取り陀くこずから始めたした。マゞックナンバヌのうち、テストの時点で、ほずんどのパラメヌタヌが画面ずブロックのサむズにリンクされおいた玄10でした。



そしお、朚はすべおを混乱させ続けたした-地面だけで生成されるこずを確認する必芁がありたした、ボリュヌムが葉のいく぀かのブロックに陰圱を远加したためですちなみに、それたでに私たちが望むように機胜したせんでした





圱付きブロックをレンダリングする機胜をデバッグするず同時に、その䞭の䜕かを最適化する必芁があるこずが明らかになりたした。 再び「゚ラヌ」の迅速な修正、再びかなり面癜い結果





それから私はすぐに気付き、䜕が間違っおいたのか、新しい修正はすぐに埅ちたした





ここでは、通垞、このスタむル぀たり、「最初に曞く、それから考える」のスタむルでコヌドを蚘述しないこずをすぐに予玄する必芁がありたす。 しかし、このプロゞェクトでは、非垞に面癜いこずがわかりたした。 結局、私のすべおの間違い、すべおの愚かさは必然的に結果に結び぀き、非垞にたれにこの結果を予枬したり、すぐに「なぜ」を説明するこずができたした。



この時点で、葉ず草草のある地面のテクスチャは特定の緑色でした。 色を倉曎できる実装が芁求されたした。これにより、ほずんど血を流さずに時間を倉曎できたす。 はい、これはJavaで簡単に行うこずができ、䜕も思い付かないこずをよく知っおいたすが、スポヌツぞの関心は匷すぎたした。 これを行うために、テクスチャが倉曎され、「テクスチャをペむントする」関数が䜜成されたした。





関数自䜓は数回修正する必芁がありたした。 圌女は混合䞉毛鯚の効果を䜜成したした䞭倮の2぀の画像が、必芁なこずはしたせんでした右の画像。 アルゎリズムの結果は次のずおりです。





時々、コヌドを敎理するために特定の方法を決定し、時々さたざたな結果を受け取りたした。 別の䟋





時々、デバッグの䞖界から非垞に面癜い状況が衚面化したした。 たずえば、グラデヌションの描画゚ラヌマルチカラヌストラむプの別のゞェネレヌタヌ





この゚ラヌのデバッグ䞭に、アむデアがすでに私にずっお䜿い果たされ始めたずき、デバッガヌは次の色の倀を生成したした。



その日、私はデバッグをやめお、デバッガが食べ物の質の悪さに぀いお話すのをやめるように䌑むこずにしたした。



この時点で、電話で結果を同時にテストするこずにしたした。 電話では、色の順序が少し異なるこずが刀明したため、赀ず青のコンポヌネントの色が堎所を倉えたした。





ずころで、私は朚が嫌いだずいうこずをもう䞀床思い出すのを忘れたした...朚は倜に奇劙に振る舞いたした





珟時点では、携垯電話は䞀般に、シフト指でスクロヌルした埌に画像を描画する方法に぀いお独自の芋解を持っおいたした。

そしお



さお、巊の写真の色は青ず赀のコンポヌネントの䜍眮を忘れたためです。しかし、トレンディなモヌションブラヌ゚フェクトは、アルファを考えおいなかったため、画像を正しく描画したずいう事実に既に「感謝」アンドロむドです。チャネルその時点たでのアルファチャネルには、䜕でもある可胜性がありたす。



ずころで 長い間、私はあなたに私の朚を芋せたせんでした ここに



ここにはいく぀かの問題がありたす-葉のいく぀かのブロックの誀った照明ず、「透明なピクセル」の誀ったレンダリングの䞡方。



䞊行しお、りェむポむントのシステム、たたは簡単に蚀えばパスを芋぀けるためのアルゎリズムの䜜業を開始したした。 ゟンビや他のキャラクタヌを远加できるようにするためにパスが必芁でしたが、同時に、その行動を毎回数歩進めお蚈算する必芁がありたせんでしたそのため、圌らは銬鹿になりたせんでした。 私にずっおは、アルゎリズムの品質を評䟡するために芖芚的にパスをマヌクし始めたした。





芖芚化のより高床なバヌゞョンは次のようになりたした。





ちなみに、結果ずしおゟンビを远加したせんでした手が届きたせんでしたが、りェむポむントシステムをデバッグしたした。 これら2぀の写真の暹朚に泚意しおください。 朚はただきれいに芋えたした...



ある時点で、朚の倖芳を修正しようずするず、別の「ポゞティブ」な結果が埗られたした。





以䞋に、透明床に盎接関連する電話からのさらに興味深いバグをいく぀か瀺したすアルファチャネル。

そしお



次に、远加のテクスチャの远加およびテクスチャむンデックスの倉曎により゚ラヌが発生したした。





次に、描画アルゎリズムで䜕かを「修正」し、かなり奇劙な効果を埗たしたおそらくテクスチャのサむズず䜍眮を台無しにした。





レンダリングアルゎリズムの最新の最適化の結果、私は䞀床に2぀の゚ラヌを受け取りたした再びミンククゞラ。

そしお



この奇跡を描くプロセスは次のようになりたす明らかに、これが最適なオプションです。





実装する必芁がある最埌のこずは、ボリュヌムブロックの端の圱響であったため、画像はそれほど平坊で単玔ではありたせんでした。 顔に぀いおは、画像のサむズを倉曎するアルゎリズムず画像を傟けるアルゎリズムの2぀のアルゎリズムを蚘述する必芁がありたした。



画像のサむズを瞮小するアルゎリズムから始めたす。





䞊から䞋-アルゎリズムの結果。 䞀番䞋-望たしい結果わかりやすくするために、テストは党䜓像で行われたした。



ロヌテヌションアルゎリズムはより明確になりたした。





巊䞊には初期画像があり、右䞋には目的の結果があり、䞭倮には結果ぞの途䞭で埗られたすべおのものがありたす。



アルゎリズムの準備ができたずき、ボリュヌムの䜜成はすでに非垞に簡単でした。 ブロックは3぀の面で構成されおいたした片偎から芋お、擬䌌3Dたたはいわゆる2.5d。 矎しさのために、線圢グラデヌションが境界に適甚されたした。これは、望たしい結果を埗るためにデバッグする必芁がありたした。





ブロック面のサむズを刀断できなかったため、このパラメヌタヌを倉曎できるようにしたした。





すべおの倉曎の埌、描画する必芁のないものを描画しないように、描画プロセスを最適化する必芁がありたした。 この最適化の結果は、電話でのテスト䞭に浮䞊した透明床チャネルの問題でもありたした。 結果がかなり奇劙に芋えたこずを認めなければなりたせん

そしお



この゚ラヌの修正により、それほど興味深い効果は埗られたせんでした。





たずめ


最終的に、重倧な゚ラヌはすべおデバッグされ、゚フェクトの圢でテクスチャずパンが远加されたした。 ストアの2぀のバヌゞョンが䜜成されたした-無料非垞に単玔化ず有料すべおの特兞付き。



私はこの蚘事で技術的な偎面さえ䞊げないこずにしたした。 だから、誰かがそれを最埌たで終わらせるかどうかはわかりたせん。 この蚘事をマスタヌした人がこのストヌリヌの技術的な偎面に぀いお知りたい堎合は、コメントたたはPMに曞いおください。私が遭遇した困難、実装機胜、およびその他の詳现に぀いお間違いなくお䌝えしたす。



これにより、既成のフレヌムワヌクずラむブラリを䜿甚するだけでなく、他の誰かが自分の手で䜕かを䜜成するようにプッシュされるこずを願っおいたす。



蚘事の最埌たで読み通しおくれた人々にも感謝したす



All Articles