VistaとWTLとOpenGL

先週、Windows XP
Visual Studio 2008
Windows SDK v1.0
WTL 8.0 Final
をインストール、WTL 8.0でOpenGLを扱うソフトをビルドして、実行ファイルをvistaマシンへ持っていって実行してみたんだけど、VC6 + WTL 7.5の時と同じ現象が出るんだよね…。
例えば、CodeProjectでダウンロードできる次のデモプログラムでも僕が作ったアプリと同じ現象を再現できる。
A WTL class for developping OpenGL programs using WTL By Zilin
(http://www.codeproject.com/KB/wtl/opengl.aspx)
このコードを実行すると、ウィンドウの位置に係わらず常に画面の左上に表示されてしまう。

(自分のPCじゃないので、デスクトップのテーマがクラシックだったりごみ箱が右上だったりするのは僕の趣味じゃない)


ちなみに僕が作ったやつはこんな感じの処理(ところどころ適当に端折ってます)。
まず、OnCreateの中でレンダリングコンテキストをこんな感じに初期化する。

CClientDC dc(m_hWnd);
	
PIXELFORMATDESCRIPTOR pfd = { 
	sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd 
		1,                     // version number 
		PFD_DRAW_TO_WINDOW |   // support window 
		PFD_SUPPORT_OPENGL |   // support OpenGL 
		PFD_DOUBLEBUFFER,      // double buffered 
		PFD_TYPE_RGBA,         // RGBA type 
		24,                    // 24-bit color depth 
		0, 0, 0, 0, 0, 0,      // color bits ignored 
		0,                     // no alpha buffer 
		0,                     // shift bit ignored 
		0,                     // no accumulation buffer 
		0, 0, 0, 0,            // accum bits ignored 
		32,                    // 32-bit z-buffer 
		0,                     // no stencil buffer 
		0,                     // no auxiliary buffer 
		PFD_MAIN_PLANE,        // main layer 
		0,                     // reserved 
		0, 0, 0                // layer masks ignored 
};

int pf = dc.ChoosePixelFormat(&pfd);
if (pf != 0) {
	if (dc.SetPixelFormat(pf, &pfd)) {
		dc.DescribePixelFormat(pf, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
		hRC = dc.wglCreateContext();
		dc.wglMakeCurrent(hRC);
		glClearDepth(1.0);
		glEnable(GL_DEPTH_TEST);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		dc.wglMakeCurrent(NULL);
	}
}

構造体初期化の部分、殆どサンプルの丸写しであるw


ああ、hRCってのはCWindowImplから派生したクラスのメンバ変数で、

HGLRC hRC;

こいつがレンダリングコンテキストを保持してます。


でもって、OnPaintで

OnPaint(HDC /*hdc*/) {
	CPaintDC dc(m_hWnd);
	dc.wglMakeCurrent(hRC);

	glClearColor(0.0, 0.0, 0.0, 0.0);	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	glLoadIdentity();
	glViewport(0,0,wnd_width, wnd_height);
	
	if (IsReadyForDrawing() != FALSE) {
		glOrtho(-m_ox / m_sca,(-m_ox + m_ww) / m_sc,-m_oy / m_sca,(-m_oy + m_wh) / m_sca, -10.0, 10.0);		
		DrawGrid(); 
		RenderLayer(GL_RENDER);
		glFlush();		
	}
	//glなんとか();
	//glかんとか();
	//…gl描画命令が続く

	dc.SwapBuffers();
	dc.wglMakeCurrent(NULL);
}

とまあ、こんな感じで描き上げてるだけです。。
ヘンな事はやってないつもりなんだけど。
MFCを使って同じ流儀で書いたテストプログラムは、Vista上でも希望通りの表示をしてくれる。
Win32 APIだけで書いたソフトも同様。
こうなったら、もうWTLを使わないように書き換えるしか……って、それ、1から全部作り直しだよ。

GPUとの相性かな?

相性というか、ググって調べたところ、Vista標準のGPUデバイスドライバOpenGL対応にいろいろと問題が有るいっぽい。OpenGLのパフォーマンスを発揮するにはメーカー純正のドライバをダウンロードしてきてインストールすべしと。。なんじゃそりゃ。
そんなわけで、Intelから945GMのドライバをもらってきて入れようとしたら「DELLでカスタマイズされたらドライバが検出されたからDELLからもらってね」みたいなエラーが表示されてインストールできなかった。で、頼みの綱のDELLのサイトには古いバージョンのドライバしかなったというオチ。
でも、WTL以外では意図どおりに動くってのがイマイチよくわからんな。

直ったよ(http://d.hatena.ne.jp/linden/20081222/p1 にスクリーンキャプチャ有り)

もう一回、DELLのサイトで945GMのドライバをよく探してみたら、OpenGLに対応してるドライバが見つかったのでダウンロードできた。
インストールしたらあっさり直った。これでドライバのせいだということはわかった。
でも、ユーザーにメーカー純正のドライバをダウンロードしてって頼むわけにもいかんしなぁ。困ったもんだ。
こまった、こまった。