Windows上でMesaといっしょにGLUT3.7を使うときは要注意です。
配布されているGLUTは,glut.hの中の#pragmaで.libを直接指定しており,SGI版かMS版しか切り替わらないので,GLUTに付属しているglut.hを使いつつ,Mesaの.libを使うとはまります。
組み合わせによっては,アプリを起動した途端に落ちるのですぐに気づきますが,場合によっては,ものすごく動作が遅いだけでなんとなく動いてしまいます。
glutmake.batを使って,ビルドすると,ご丁寧にも,dllを差し替えてくれたりしますので,さらに厄介です。
というわけで対処法です。glutのルートディレクトリのglutwin32.makをいじります。
# Microsoft OpenGL libraries
#
GLU = glu32.lib
OPENGL = opengl32.lib
GLUT = $(TOP)/lib/glut/glut32.lib
GLUTLIB = glut32.lib
GLUTDLL = glut32.dll
これらの.libをMesaのものに書き換えます。さらに,
CFLAGS = $(cflags) $(cdebug) $(EXTRACFLAGS) -DWIN32 -I$(TOP)/include
の最後の-Iで指定するインクルードファイルの置き場所も,Mesaのものに書き換えます。
で,システムフォルダのglut.dllが勝手に書き換えられないようにしつつ,サンプルなどのビルドを行いたい場合は,progsフォルダにもぐって,
nmake -f Makefile.win
とするのが楽です。先ほど書き換えたglutwin32.makを取り込んでmakeしてくれます。
あと,例えば,progs\advanced97\volume.cなどでは,
volume: requires OpenGL texture 3D extension to operate correctly.
みたいなメッセージが出ますがなんとなく動きます。ただしmakeでこけるので,手抜きの対応としては,
#define GL_GLEXT_PROTOTYPES
#include <GL/glut.h>
てなマクロ定義を追加してやると良い具合です。
ちなみにこのサンプル,私のビデオカードは3Dテクスチャに対応していないのですげー重いです。
でもまぁ,ビデオカードが対応して無くてもソフトで最新機能をなんとなくやってくれるMesaのおかげで動くわけではありますが。
togleinfoの比較
GL_EXTENSIONS: GL_ARB_imaging GL_ARB_multitexture GL_ARB _point_parameters GL_ARB_texture_compression GL_ARB_texture_cube_map GL_ ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_transpose_matrix GL_ARB_vertex_ program GL_ARB_window_pos GL_S3_s3tc GL_EXT_abgr GL_EXT_bgra GL_EXT_ blend_color GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_clip_volume _hint GL_EXT_compiled_vertex_array GL_EXT_draw_range_elements GL_EXT_fog _coord GL_EXT_multi_draw_arrays GL_EXT_packed_pixels GL_EXT_paletted_ texture GL_EXT_point_parameters GL_EXT_rescale_normal GL_EXT_secondary_ color GL_EXT_separate_specular_color GL_EXT_shared_texture_palette GL_ EXT_stencil_wrap GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_ combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT _texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_object GL_EXT_vertex _array GL_EXT_vertex_weighting GL_IBM_texture_mirrored_repeat GL_KTX_ buffer_region GL_NV_blend_square GL_NV_fence GL_NV_fog_distance GL_NV_ light_max_exponent GL_NV_packed_depth_stencil GL_NV_pixel_data_range GL_ NV_point_sprite GL_NV_register_combiners GL_NV_texgen_emboss GL_NV_ texgen_reflection GL_NV_texture_env_combine4 GL_NV_texture_rectangle GL_ NV_vertex_array_range GL_NV_vertex_array_range2 GL_NV_vertex_program GL_ NV_vertex_program1_1 GL_SGIS_generate_mipmap GL_SGIS_multitexture GL_ SGIS_texture_lod GL_WIN_swap_hint WGL_EXT_swap_contro
GL_EXTENSIONS: GL_ARB_depth_texture GL_ARB_imaging GL_ARB_multis
ample GL_ARB_multitexture GL_ARB_point_parameters GL_ARB_shadow GL_ARB_shadow_am
bient GL_ARB_texture_border_clamp GL_ARB_texture_compression GL_ARB_texture_cube
_map GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossb
ar GL_ARB_texture_env_dot3 GL_ARB_texture_mirrored_repeat GL_ARB_transpose_matri
x GL_ARB_window_pos GL_ATI_texture_mirror_once GL_EXT_abgr GL_EXT_bgra GL_EXT_bl
end_color GL_EXT_blend_func_separate GL_EXT_blend_logic_op GL_EXT_blend_minmax G
L_EXT_blend_subtract GL_EXT_clip_volume_hint GL_EXT_convolution GL_EXT_compiled_
vertex_array GL_EXT_fog_coord GL_EXT_histogram GL_EXT_multi_draw_arrays GL_EXT_p
acked_pixels GL_EXT_paletted_texture GL_EXT_point_parameters GL_EXT_polygon_offs
et GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_shadow_funcs GL_EXT_share
d_texture_palette GL_EXT_stencil_wrap GL_EXT_stencil_two_side
GL_EXT_texture3D G
L_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EX
T_texture_env_dot3 GL_EXT_texture_object GL_EXT_texture_lod_bias GL_EXT_vertex_a
rray GL_HP_occlusion_test GL_IBM_rasterpos_clip GL_IBM_texture_mirrored_repeat G
L_INGR_blend_func_separate GL_MESA_pack_invert GL_MESA_resize_buffers GL_MESA_yc
bcr_texture GL_MESA_window_pos GL_NV_blend_square GL_NV_point_sprite GL_NV_textu
re_rectangle GL_NV_texgen_reflection GL_NV_vertex_program GL_NV_vertex_program1_
1 GL_SGI_color_matrix GL_SGI_color_table GL_SGIS_generate_mipmap GL_SGIS_pixel_t
exture GL_SGIS_texture_border_clamp GL_SGIS_texture_edge_clamp GL_SGIX_depth_tex
ture GL_SGIX_pixel_texture GL_SGIX_shadow GL_SGIX_shadow_ambient
昨年くらいから,Cygwinで気軽にXサーバが動くようになりました。X11用のMesaは元々入っているのですが,物は試しにMesa5.0.1をmakeして動かしてみました。
特に問題なく,動きます。ものすごく重いですけど。
OpenGLをWindows上で使うなら,Win32ネイティブの方がパフォーマンスも高くて使い勝手も良いことは重々承知の上です。こんな靴の上から足を掻くような所業は間抜けですらあります。
ただ,GEOMAPの件で調べていても思うのですが,教育・研究用途などで使われる場合は,X用のソースも結構あります。私は趣味の範疇でいじくる立場の身ですから,さささっとソースを借りてきて動かしたり改造したりできることがなによりなのです。
何気なくMesa5.0(5.1?)のソースを眺めていたら、Win32のポートがしっかりあるので、ビルドしてみました。
できたdllを入れれば、サンプルはすんなり動きます。
自前のアプリをヘッダとlibを入れ替えてビルドしたらmesagl.dllで例外発生。ウィンドウを生成したところでこけている模様。
wglCreateContext()でこけているので、調べるのにも気合が必要かも。
あとはDirectDraw対応部分のソースを見ていると、フレームバッファのクリアで、サーフェイスからGetDC()してるんですけど、大丈夫なんでしょうか。必ずうまくいくとは思えなかったり。
でも対応ビルドしたサンプルの一部は確かに早いので、効果があるにはあるのでしょう。
さらに、
alt.software
http://www.altsoftware.com/index.htm?main.htm&2
のMESA用ドライバ(Direct3D利用)にもトライしたものの、失敗。
Opengl32.dllと入れ替えるようになっているのですが、Mesaはmesagl.dllという名前なので、変です。
Mesaのdllの名前が最近変わったのかどうかはよくわかりませんが・・・
しかしまぁ、dllを入れ替えてみるだけのために、なんで2回も再起動せにゃならんのでしょう>Windows2000
yaneSDK2ndをちょこっと使っていて、CDIB32ならGDI描画できるので、OpenGLもいけるのかなー、といろいろ試行錯誤した結果を残しておきます。
CDIB32でおさえておくべきところ
OpenGLでおさえておくべきところ
ほとんど下に書いてある寺西さんのサンプルのままで大丈夫ですが、そうはいってもピクセルフォーマットの辺りは鬼門なので、以下にコードサンプルを載せておきます。
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
1,
// version number
PFD_DRAW_TO_BITMAP | //
BITMAP を指定すること
PFD_SUPPORT_OPENGL,
// support OpenGL
PFD_TYPE_RGBA,
// RGBA type
32,
// 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
};
ちなみにCFastPlaneでは、UseSystemMemory()を使おうが何をしようができませんでした。
CPlaneならできる場合もあるかもしれませんが、今さらなので、やりません。
#CDIB32自体がyaneSDK3rdでは今さら、ですが・・・
参考
寺西さんのオフスクリーンレンダリングサンプル
http://www.asahi-net.or.jp/~YW3T-TRNS/opengl/samples/offscrn/index.htm
(2002.12.17)ですます調に書き換え。
OpenGLに関して、イケてるサイトがNeHeです。
フレームワークもいろいろあり、サンプル・チュートリアルも充実なので利用しているのですが、英語なのが辛いので、ちょびちょび翻訳することにしました。
英語は苦手なので、超訳ですが・・・
Article Polygon Classes
Article ポリゴンクラス
(2002.12.04登録)
(2002.12.06更新)
Article Camera Class Tutorial
Article カメラクラスチュートリアル ←翻訳途中
(2002.12.07登録)
※無断で引用してますんで、ご留意くださいませ。まとまってきたら、あちらに連絡取ります・・・