プログラミング一覧

インデックスバッファ

DirectX9では16bitインデックスバッファが主流だったように思います。しかし、DirectX10以降はインデックスバッファも32bitインデックスとなってしまったようです。
生成時に16bitであると設定するものが見あたらない…。

DirectX9から10以降まで1つのAPIセットで対応するライブラリ作ってますが、
このような違いってどうしたものやら。

  1. フォーマット指定を追加。使えない環境(DX10世代)ならエラーにする
  2. あくまでフォーマット指定はヒント。
    1. 書き込み時とかには生成された結果フラグをみてUSHORT, UINTでインデックスを書き込み

どちらの方法にしてもキレイにならない気がします…。

  • 過去日記に同じようにこの情報を書いていました。10環境では16bitインデックスがなくなった、と。

VS2010対応 – ゲームプログラマになる前に~のやつ –

「ゲームプログラマになる前に覚えておきたい技術」に付属しているソース類で、
VisualC++2010用に変換したプロジェクトおよびソースコードを用意してみました。手元の環境でデバッグ/リリース構成のビルドを確認しています。2011/02 新バージョンを公開しました。
こちらからどうぞ

プロジェクト変換について

  • ライブラリの全体最適化を無効化してあります。
  • ワーニングレベルを3に落としたものがいくつかあります。
  • 算術関連(sin,cos,tan,など)を名前空間付きに変更しました。

サンプルコードによっては、全体最適化適用による不具合のため、
exe用のプロジェクトでも無効化してあるものがあります。

なお、変換に用いたのはVisulStudio2010Professionalです。
ですが、expressエディションでも開くことは可能かと思われます。

注意事項

公開しているアーカイブの再配布を禁止します。
また、公開したアーカイブを使用したことによる損害については、
筆者および公開した私自身がその責務を負わないこととします。
利用する際には、自己責任でご利用下さい。

ダウンロード、および、使用方法

CDROM内にある、VisualStudio2008用のソースコードを展開した後、
srcフォルダでダウンロードしたファイルを上書きで展開してください。

2011/02 新バージョンを公開しました。
こちらからどうぞ

注意事項に同意のうえ、ダウンロードする

このファイル中にソースコードが一部含まれますが、
これについては著者の許可をもらって公開しております。

動作確認環境

  • Windows7 Ultimate x64環境
  • VisualStudio2010Professional
  • PentiumDualCore E6500
  • Geforce9800GT

この環境で、含まれるサンプルソースコードの実行等を確認しております。
少なくともこのプロジェクト類を用いて 64bit環境での動作を確認できております。


ミップマップについて

どうやらミップマップが使われるためには、
射影行列(透視変換行列)適用してからじゃないとダメな模様。行列適用しないで、通常の射影空間(0-1)に収まるように頂点を準備して、
テクスチャ貼り付けてみたけど、これではミップマップがポリゴンの面積に応じて使われることがなかった。

しかしその準備した頂点で作られるポリゴンの面積によっては、
ミップマップが使われたりしたが、頂点単位?でしか判定していないのか?

一方、透視変換行列適用してみると、
ピクセルごとにどのミップマップレベルを使用するかが判定されており、
画面に描画してみるとその使用状況がわかった。

根本的に何が原因だったのかはわからんなぁ…。


アルファブレンディングについて【教えてほしい】

アルファブレンドで下記の合成はわかった

  • 通常合成(1*srcColor + 0*destColor)
  • 加算合成(1*srcColor + 1*destColor)
  • 半加算合成(srcA * srcColor + 1*destColor)
  • 半透明合成(srcA * srcColor + (1-srcA) * destColor)

しかしこれらがアルファ値だけ別の計算が出来るという仕組みが用意されていたりする。
これの有効な利用が思いつかない。

OpenGLやDirectXではアルファブレンドセパレートとして機能があったりするが。

D3DRS_SEPARATEALPHABLENDENABLE を有効化して
なにかやっているサンプルもまた見つからなかったし。
有効に使えている例、使える例を知っている人は是非教えてください。


テクスチャアドレッシングモード

テクスチャアドレッシングモード

テクスチャを張ったときに、1.0以上の値をどう扱って、
テクスチャを張るかのモード設定です。

出来ることの代表的なものとして、

  • 繰り返し貼る(リピート)
  • 反転しながら貼る(ミラー)
  • 繰り返さずに残った部分は引き延ばし

というのがあります。

OpenGL vs DirectX

で今回感じたのが、OpenGLとDirectXでこれらの機能の差違。
同じ挙動をする設定でも、画面の描画結果が違うということになりました。
もっとも大まかな挙動という点では一緒で、
今回の違いというのは、描画ピクセルが完全一致しないということを示しています。

どうも境界あたりの処理でそれぞれ差違が出ていました。
GL_CLAMP_TO_EDGEやGL_CLAMP_TO_BORDERなど標準機能ではなく
拡張機能で試したのですがうまくいきませんでした。

どうでもいいこと

テクスチャラッピングモードというとまた別のことを指すようです。
少しわかりにくい気がするのは自分だけでしょうか…


OpenGLのメモ

テクスチャのアドレッシングモードで、
境界色へのクランプってソフトウェア処理と思っていたが、
ちょっと前からそれは違っていたらしい。発覚したのは GL_CLAMP_TO_BORDER について調べてみたからで、
ある海外サイトによると、GeForce2のころはソフトウェア処理となっていたようだ。

あと、GL_CLAMP_TO_BORDERが3.0仕様では deprecatedになっている!という
記述を見かけたけど、OpenGL 3.1の仕様書を見てみたところ、
普通に記載があった。海外サイトのコメントをみていたら廃止というのがミスだったようで…

廃止になったのは、GL_CLAMP のようです。


DirectXのデバッグランタイム不具合

Windows7 (x64)の環境で、DirectX9を用いた開発を行おうとすると、
SDKのバージョンによっては問題を引き起こすことがわかった。検索しても海外でしか、同じ症状が発見されず、また解決法も不明だったので、
問題のあるバージョンを使用しない方法でしか解決が出来ないようだ。
それでも、別バージョンを使えばOKという点はまだ救いなのかもしれない。

問題

Windows7(x64)において、DirectX9のデバッグランタイムを有効にすると、
CreateDeviceで失敗する。
そのときのエラーメッセージは次の通り。

コメントもらったので修正
試したのは全て、Windows7(x64)環境下です。
x86環境では問題が起こらないのかもしれません。
どうやらx86,x64環境ともに発生するようです。

SDKバージョン 使用可否 Windows仕様
2008Nov 使用不可能 Win7(x64)
2009Mar 使用不可能 Win7(x64)
2009Aug 使用可能 Win7(x64)
2010Feb 使用可能 Win7(x64)

 

まとめ

このような結果になったので、Windows7環境でまともに使おうと思っても、
古すぎるSDKは使いにくい。2009Augがいいところだろうか。


R2VB

どうやら最近のNVIDIAドライバ+新しめのボードだと、
R2VB(Render To VB)は使えないようだ。チェックしてみてもNGとなってしまう。
これってGeForce6200とかで使えたという噂を聞いたけど、
そのくらい昔のハードでしか使えないってことなんだろうか。

※ R2VB使うくらいなら DirectX10以降のストリームアウト使えってことか

DirectX9で、ストリームアウトはあきらめろということで結論かも。
OpenGLならエクステンション駆使して何とかできるのかもしれない。


今日のトラブル

原因不明。IDIRECT3DDEVICE9のSetVertexShaderConstantF関数で設定した値が、シェーダーに送られてない。
一方で、D3DXのID3DXCONSTANTTABLEで設定すると値はきちんと送られている。

なぜだー。

これのせいで数時間もアルゴリズムの方が間違っているのかと悩んでた。

現在ダウンサンプリングを勉強中


RedmineでSVNリポジトリとの同期

先日、cronを利用してRedmineの活動カテゴリで
ソースコードのコミット履歴もある程度のタイミングで反映されるようにしてましたが、
Subversionなら別の方法も採れるのでは?と試してみました。Subversionのサーバー側でのフックスクリプトを使用します。
post-commitスクリプトで、

/usr/bin/ruby /redmine/script/runner “Repository.fetch_changesets” -e
production

これでコミット直後でRedmine側が更新されるので、
なかなかいいんじゃないでしょうか。