So-net無料ブログ作成
programming ブログトップ

D3DXCreateTextureをする場所 [programming]

USBカメラで撮影している画像をDirect3Dを使って表示するプログラムを書いていたのだけれど,全画面表示をすると異常終了してしまう.
いろいろ検証した結果, D3DXCreateTextureをする場所が悪かったみたい.

 
D3DXCreateTexture(pd3dDevice,
		pImage->width, pImage->height, 1, 
		D3DUSAGE_DYNAMIC, D3DFMT_A8B8G8R8, D3DPOOL_DEFAULT, &m_pTexture);


をCreateDevice内でやっていたのだけれど,ResetDeviceでやるようにしたら直った.もちろんテクスチャをReleaseする場所もDestroyDeviceからLostDeviceに変更.


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Win32コンソールアプリケーションの終了方法 [programming]

Win32コンソールアプリケーションをコンソールの閉じるボタンを押して終了した場合,デストラクタで終了手続きをするだけだとうまくいかない.
その場合は,シグナルハンドラを登録して,クローズボタンが押されたというシグナルをキャッチして終了処理をする.

// シグナルハンドラのセット
	::SetConsoleCtrlHandler(SignalHandler, TRUE);
BOOL WINAPI SignalHandler(DWORD ctrlChar){
	switch(ctrlChar){
	case CTRL_CLOSE_EVENT:

		// 終了処理 //

		return TRUE;
		// TRUEを返すと,他のハンドラは呼び出されずに元の処理に戻る.
		// FALSEを返すと,次のハンドラが呼び出される.
		break;
		// 他にも以下のシグナルがある
		// CTRL_C_EVENT
		// CTRL_BREAK_EVENT
		// CTRL_LOGOFF_EVENT
		// CTRL_SHUTDOWN_EVENT 
	}
}

GUIライブラリ [programming]

今作ってるアプリケーションにGUIをつけようとしてライブラリを探してみました.
開発環境は Windows + Visual C++.
既存のプロジェクトに後からMFCや.NETでGUIを追加するのは難しいみたいなので,それ以外で探してみました.

候補1: wxWidgets
wxWidgets は WindowsやLinux, Mac OS などのマルチプラットフォー ムに対応したオープンソースの GUI ツールキット.
wxGladeでGUIを設計して,ソースコードを生成してコーディングすれば簡単だし,多言語への移植も容易にできるらしい.
ただOpenGLを表示するウィンドウのクラスが全てのOpenGLの昨日に対応していないっぽく(僕の調査不足かもしれませんが),将来性に不安を感じたので断念.

候補2: Qt
これもマルチプラットフォーム,マルチランゲージなライブラリ.
完成度はwxWidgetsよりも高いけど,商用なので見送り.
ただしソースコードを公開するならOpenSource版がフリーで使える.
[参考]
Qt リファレンス翻訳
Qt

候補3: GLUI
OpenGLのGLUTを使っているなら,GLUIを使えば簡単にGUIが追加できる.
今作ってるアプリはOpenGL使ってないけど,OpenGL化はそんなに難しくないのでこれにしておこうかな.
[参考]
GLUIリファレンスマニュアル日本語版
glui : OpenGL / glut 用簡易ウィジェット


クラスの相互参照(C++) [programming]

クラス C1 でクラス C2 を参照し,かつ,クラス C2 でクラス C1 を参照する場合,前送りのクラス宣言ををしておく必要がある.
ただし相互参照するクラスはポインタか参照のみ.

class C2;
class C1 {C2 *m_pc2; …};
class C2 {C1 *m_pc1; …};

System::String を標準文字列に変換する [programming]

環境: Visual C++ 2005 express edition

void func(System::String^ s){
  using namespace Runtime::InteropServices;
  const char* p = (const char*)(Marshal::StringToHGlobalAnsi(s).ToPointer());
  // const char* pを利用するコードを書く
  Marshal::FreeHGlobal(IntPtr((void*)p));
}

error C2872: 'IServiceProvider' : あいまいなシンボルです。 [programming]

環境: Visual C++ 2005 express edition
using namespace System と windows.h
を両方使うと,両者にIServiceProviderの宣言があるので競合する.
とりあえず System名前空間を必要もないのに全体に適用しないように,必要な部分にだけSystem名前空間を適用するようにすれば解決.

namespace xxxx{
 using namespace System;

}

windows & C++ での実行時間計測(フレームレート計算) [programming]

リンクするライブラリに
winmm.lib
を追加し,

#include <windows.h> // マルチメディアタイマに必要
#include <mmsystem.h> // マルチメディアタイマに必要

を宣言.

DWORD oTime, nTime;
oTime = timeGetTime(); // CPU時間をミリ秒単位で返す
for(;;)
{
	実行時間を計りたいプログラムのコード

	nTime = timeGetTime();
	printf("実行時間:%d[ms])\n",(nTime-oTime));
		//1フレームの実行時間表示
	printf("フレームレート:%7.5f[fps]\n",(1000.0/(nTime-oTime)));
		//フレームレート表示
	oTime = nTime;
}

OpenGL テクスチャのモード変更 [programming]

OpenGLのテクスチャのモードはデフォルトでは掛け算(GL_MODULATE)になっているので,glColorで色を変えた後にテクスチャを描画すると色が掛け合わされる.
よってテクスチャを書く前に

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

を実行してテクスチャを置き換えるモードにしておく.


boost library uBLAS で行列の要素へのアクセス [programming]

boost library uBLASで行列などを使う際,

boost::numeric::ublas::matrix mat(4,4);
double d;

d = mat[0,0];

だと,型チェックエラーで行列計算の結果をdouble等の普通の変数に入れられないが,

d = mat(0,0);

だとOK.


グローバル変数 [programming]

プログラミングのメモ.
C++でスコープ外のグローバル変数varを参照するには
::var
のように::をつける.


programming ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。

×

この広告は1年以上新しい記事の更新がないブログに表示されております。