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

描画の最適化を考える

前の記事で書いたダンジョンゲーの画面を大きくしたやつをうちのノートで動かすと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) とすればそのサイズのレンダータ…

残作業

DXRuby1.1で追加したクラスはPolygon、Mesh、Matrix、Vector、Shader、RenderTargetの6つ。 3D系、計算サポート系、2D強化系ということで2つずつ。 それぞれ基本的に動作するようになったというレベルで、使いやすさはまだまだだから、色々と追加変更は必要…

フォグ機能を作ってみた

これを使うとこんな描画ができるようになる。 しょぼしょぼだったブロック崩しがかっこよく! もうちょっといじって1.1.4にしよう。

擬似3Dのサンプル

こんなサンプルのほうが直感的にわかりやすいかもしれない。 DXRuby1.1.4以上。 require 'dxruby' image = Image.new(80,80,[255,255,255]) Window.setFog(FOG_LINEAR, [0,0,0], 0, 3000) Window.loop do for z in 0..9 for y in 0..2 for x in 0..3 Window.…

Shaderクラス

まだちょっと作ってみた状態だから出せないけど。 require 'dxruby' hlsl = <<EOS float4 g_blend; float4 g_tone; texture Tex; sampler Samp = sampler_state { Texture =<Tex>; }; struct PixelIn { float2 UV : TEXCOORD0; }; struct PixelOut { float4 Color : COLOR0; }; PixelOut PS(PixelIn input) { PixelOut output; float3 temp; float3…</eos>

1.1.1

trunkから取って自分でコンパイルしてください。 っていうのはユーザー層から考えて無茶な話だから、数字をガンガン上げて公開することにした。 機会があればここに書くが、基本的にはWiki見てね、って感じで。 http://dxruby.sourceforge.jp/files/dxruby1.…