ラピュタエフェクト3

http://i-saint.skr.jp/flv/20070821.flv
gl_ModelViewMatrixは既にカメラ変換かけた後の行列なので(これに気付くのに時間がかかった…)、ホストプログラムからカメラ変換の逆行列を渡すことでシェーダ側でも3次元の位置情報を扱えるようだ。
pixel shaderでフラグメントの位置情報を利用してみた図。

フレームレートの維持云々

SDL 1.2.10でOpenGL使用時のVSync待ちのon/offを切り替える機能がついたらしき。

SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);

とか。早速設定項目に盛り込んだ。



あと、VSyncを待たずに60FPSを維持するいい方法を発見。
http://spitfire.client.jp/program/fps.html#ss10
16.6666..*3が50になるのを利用して、更新のタイミングを「経過ミリ秒の3倍が前回更新時から50を超えた時」にする、というもの。目から鱗。
実際にやってみたところ、綺麗に60FPSを維持できた。
ティアリングまでは防止できないけど、更新間隔16msを決め打って62〜61FPSをふらつくよりはなんとなく気分的にいい。