PTAMで画面が正しく表示されない時のやっつけ対処法
ちょっと後輩に相談されたので思い出したけど、PTAMの実装では、マシンのハードウェア構成によってはどうやら画面をうまく描画できないらしい。そういえばそんなことがあったなと思って、かなり今さらですが一応対処法を公開しておきます。
原因はglDrawPixelsという関数で、一気に描画を行おうとすると画面が真っ黒になったりするっぽい。当時は自分の研究(プロジェクト)の面倒を見てくれている先輩からその話と対処法を教えてもらったんだけど、その時に使いやすいように関数化したのが以下。
"drawpixels.h"
#include "OpenGL.h" #include <cvd/image.h> #include <cvd/byte.h> #include <cvd/rgb.h> namespace CVD{ template<class C> inline void subDrawPixels(const SubImage<C>& image) { static const int resx = 200; static const int resy = 200; int dx = image.size().x / resx; int dy = image.size().y / resy; int mx = image.size().x % resx; int my = image.size().y % resy; ImageRef size(resx,resy); for(int i=0; i<dx; i++){ for(int j=0; j<dy; j++){ ImageRef pos(i*resx,j*resy); glRasterPos2i(i*resx,j*resy); glDrawPixels(image.sub_image(pos,size)); } ImageRef size2(resx,my); ImageRef pos(i*resx,dy*resy); glRasterPos2i(i*resx,dy*resy); glDrawPixels(image.sub_image(pos,size2)); } ImageRef size3(mx,image.size().y); ImageRef pos(dx*resx,0); glRasterPos2i(dx*resx,0); glDrawPixels(image.sub_image(pos,size3)); } }
やってることは大したことなくて、単純に描画の領域を分割してるだけ。
このヘッダファイルをPTAMのディレクトリに放り込んで、glDrawPixels関数を呼んでいるファイル内からインクルードしてやった上で、glDrawPixels関数をここで定義したsubDrawPixels関数に置き換える。確か対象となるファイルはTracker.ccとCameraCalibrator.ccだったかな?
保証は何もありませんが、まぁ原因の一つということで。