2010-01-01から1ヶ月間の記事一覧

シェーダで画像のくりぬき

今日のんはDXRuy1.1.12dev対応。 画像をクリヌキするシェーダを書いてみた。 DXRuby1.0の機能でどうにかならんかと思って考えていたのだが、手が思いつかなかった。 背景が黒で、黒く抜くだけなら、黒い絵に透明色の円を描いて重ねればいいが、やりたいこと…

レーザーの判定とか

DXRuby公式サイトの掲示板に久しぶりに書き込みがあった。 内容は高速で移動する物体の衝突判定、ということだったのだが、簡単なゲームで扱うのはだいたい遅い物体と速い物体の衝突だろうということで、そのような回答になった。 これがもし、高速で移動す…

衝突判定と拡張ライブラリ

2Dのシンプルなアクションゲームを作る場合、衝突判定は円と円、もしくは矩形と矩形で判定することになる。 そのような簡単な判定でも、すべてのオブジェクト同士が衝突する可能性があるものを総当りで検出していると、たかだか50個ぐらいのオブジェクトを動…

DXRuby1.0.8を考える

DXRuby1.0.7をリリースしたのが11月。 そこから出た不具合も、言うほど致命的なものがなかったので放置してきたが、いい加減たまってきたのと、1.1系の修正も面倒なのとか難しいのとかが残ってきたので気分転換に1.0.8を考える。 まったくもっていい加減。ロ…

3D機能で2D描画をする話

DirectX9には2D描画機能が無い。描画はすべて3Dだ。 一応D3DXSpriteが用意されていて、これは内部で3D処理をやっているが、インターフェイスは2D描画として扱える。でもちょっと遅い。もっと高速な2D描画が必要なら、3D機能を使って2D描画することになる。 3…

描画の最適化を考える

前の記事で書いたダンジョンゲーの画面を大きくしたやつをうちのノートで動かすと30fpsとかになった。 このノートは遅いからしょうがないのかもしれないが、描画負荷を全く考えてないサンプルをベースにしているから、そのへんにも原因がある。 ダンジョンゲ…

2Dと3Dとマップ描画処理

DirectXの描画にはDrawPrimitiveとDrawPrimitiveUPがある。どっちが速いのか、どう使い分けるのか。 頂点バッファっつーものがある。これはVRAM上に頂点の座標その他の情報を突っ込んでおいて、GPUから高速にアクセスするためのものだ。 DrawPrimitiveはこの…

ルービックキューブ

今日中にできなかったら昼飯をおごるという約束でとりあえず作った。 全体をまわす処理ができていないのでカーソルはどこまでもいける。どこまでもな。 操作はカーソルキーでカーソル(白い四角)を動かして、シフト押しながらカーソルで回転。 まあ、アルゴリ…

ハッシュの使い方

Rubyの拡張ライブラリを作ってはいるが、どこかの何かを見て勉強した、というわけでもなく。ほぼ我流。 強いて言うならREADME.EXT.jaとかRubyのソースとかStarRubyのソースとかを見て勉強した。 今日はDXRubyの実行速度を改善できたのでそのメモ。 DXRubyのW…

ダンジョンゲー(開発中)の紹介

DXRuby1.1系開発版を使って、このブログにコメントとかもつけてくれているterua氏が開発中のダンジョンゲー。 許可を頂いたのでこのブログで紹介してみる。 画面はこんな感じ。 3D機能を活用してこの画面がぐりぐり動く。しかもterua氏は3Dプログラミング初…

さらに影つけをいじる

これでどーだ。 法線マップ生成を三角関数で計算するようにした。 この絵だけ見ると綺麗に出ているように見えるが、いろいろパラメータを変えるとまだちょっとおかしいのは法線マップのせいなのか影つけアルゴリズムのせいなのか。 3Dなら実際に立体モデルが…

高さマップ

法線マップをもっと真面目に作ろうと思って、とりあえず高さマップから法線マップを作ることを考えた。そうすれば高さマップに従ってきちんとした法線マップが作れるはずだ。 となると、今度は高さマップをきちんと作らなければならない。高さマップをそれっ…

影付けを改善

単純な円を描画したら明らかにおかしかったので、あれこれ考えて、修正したら少しマシになった。 あと、影の境界線も少しぼかすようにした。 修正点はHLSLの計算式(と他ちょっと)で、これが正しいかと言われるとまだちょっとよくわからないが、まだ影が変な…

光学迷彩の実験

かなりいい加減で実用段階ではない。 法線マップは他の画像に適用できないし、シェーダもいい加減だが、こんな感じで2Dゲーでも光学迷彩ができる可能性があることは確認した。 背景に良い絵がなかったので前に使ったトランジション画像を使った。 宇宙人が隠…

A*探索アルゴリズムにチャレンジ

最近なんだかtwitterとかでよく見るので、そういえば作ったことないしひとつチャレンジしてみようかと。 A*探索アルゴリズムはたとえばシミュレーションゲームの敵の移動なんかで使われている(らしい)移動経路探索のアルゴリズム。 ヒトマスずつ調べて、元…

2D画像に全自動で影つけ

自動で法線マップを生成して、シェーダで影を付ける。 こういうのをやってみたいとずっと思っていたのだが、やってみるとなんだか思うようにいかない。 法線マップが理想どおりに作れるとは思ってはいなくて、綺麗に描画するには後で手で修正できるようなツ…

シンプルなSceneクラス

簡単なシーン制御クラス。 class Scene EXIT = :exit def self.start(scene) loop do next_scene = scene.update if Scene === next_scene scene.quit scene = next_scene scene.init elsif next_scene == EXIT scene.quit break end end end def init end d…

HLSLでオセロ(うごきません)

ピクセルシェーダはピクセルを打つ点を出力するから、他の点をチェックしてひっくり返る条件を満たしていれば色を変えることで、オセロの判定を作ることができるかもしれない。 と思ったので試してみた。 が、なぜかコンパイルが終わらず、動かせられなかっ…

エラーでた

コンパイラを動かしっぱなしにしたらこんなエラーが出た。 Shader uses texture addressing operations in a dependency chain that is too complex for the target shader model (ps_2_0) to handle英語はよくわからんが、テクスチャアクセスがシェーダモデ…

DXRubyでPNG出力

DirectX9ではPNG入力はできるが出力ができない。出力フォーマットとして指定してもまともに出てくれない。 DXRuby1.0系では諦めていたが、ZLibを使えばRubyレベルで簡単に出力することはできるようだ。 参考はまめめもさまとKEEP OUT 原始力研究所さま。 htt…

DXRuby1.1.10dev

http://dxruby.sourceforge.jp/cgi-bin/hiki.cgi?%A5%D5%A5%A1%A5%A4%A5%EB%C3%D6%A4%AD%BE%EC disposeメソッドの実装、DXRUBY_RENDERTARGET定数の廃止、Shaderのパラメータを切り替えながら複数描画、フルスクリーン切り替え関連の不具合修正。 一つのShade…

Shaderでライフゲーム

自分の実力ではないけど。 http://ja.doukaku.org/comment/5512/ 使えるようにちょっとだけ変えた。 頂点シェーダを殺したのと、テクスチャ変数名の変更。 なんかおかしかったのを直したので差し替えといた。DXRuby1.1.9とruby1.8.7で確認。 このサイズのto_…

DXRuby1.1の位置づけとか

あんまりやる気が出ないので思ったことをツラツラと書いてみる。 DXRuby1.1はどういうものなのか。 とりあえず、DXRubyとして初心者向けであるという立場は変わらない。 1.0系の機能はそのまま継承するから、とっつきやすさ、扱いやすさは下がることはないの…

DXRuby1.1の3D

DXRuby1.1では3D描画の機能を追加した。 最大のポイントは2Dベース・ピクセル単位の座標系だ。 3D初心者が最初にとまどうのはそこだ、と思っている。俺がそうだから。 座標を-1.0〜+1.0とかで表されても、画面のどこにどのように描画されるのか、というのが…

DXRuby1.1.9devとRuby1.8対応

RenderTargetオブジェクトをImageオブジェクトにするRenderTarget#to_imageを追加した。 これでまた一つ自由度があがったのではないかと思う。 また、1.1.9devからRuby1.8用も提供するようにした。 サンプルが一通り動くことを確認した程度なので、何かおか…

DXRuby1.1でRGSSのトランジション

Window.drawShaderの引数にImageオブジェクト(もしくはRenderTargetオブジェクト)を複数指定できるようにした。 これを使うとシェーダに描画する画像と加工する材料を渡すことができる。 RGSSのトランジションも実現できそうだったので作ってみた。 RGSSのデ…

GPUの進化の方向性

DirectX9では頂点シェーダとピクセルシェーダが使える。 頂点シェーダは入力された頂点を回転したりし、そこからスクリーン上の3点を結んだ三角形を生成する。 ピクセルシェーダは三角形内の全ピクセルに対し、色を置く。 この2つは結構自由にプログラムを組…

ラスタースクロールのテスト

RenderTargetとShaderでラスタースクロールができるんじゃないか、ということで試してみた。 変数で調整できるようにしようと思って用意したけど面倒だったから固定になってしまった。多分どうにでもなる。 #!ruby -Ks require 'dxruby' map = [[0, 0, 0, 0,…

RubyとWindowsAPIでテキストエディタ

WM_PAINTの処理とDCを扱う機能、それからIMMのインターフェイスをちょっとだけ作ってみた。 こんなことができるようになった。かなり中途半端だけど気合いが尽きたのでここで公開。 Ruby1.8用。カーソルを動かしたり文字を入力したりできる。変だけど日本語…

RenderTargetクラス

RenderTargetクラスを追加した。 これはImageクラスから編集機能を削ったようなクラスだが、RenderTargetオブジェクトは名前の通りレンダーターゲットとして指定できる。 サイズは自由で、 RenderTarget.new(width, height) とすればそのサイズのレンダータ…