試作:GLSL互換ベクトルクラス
シェーダーのベクトルはswizzle機能が最高です。これをC++で実現するのは長年の夢でした。さらに、SIMDを実装に用いれれば...最高です!
一応、こんなことができるところまで行きました。
using namespace glsl_math; vec4 a( 1, 2, 3, 4 ), b( 5, 6, 7, 8 ); vec4 c( a ); c += b; BOOST_CHECK( vec4( 6, 8, 10, 12 ) == c ); BOOST_CHECK( a.wzyx() == vec4( 4, 3, 2, 1 ) ); vec4 d( a.wyxz() ); BOOST_CHECK( vec4( 4, 2, 1, 3 ) == d ); d.yzwx() = b.xywz(); BOOST_CHECK( vec4( 7, 5, 6, 8 ) == d ); vec3 e( d ); BOOST_CHECK( vec3( 7, 5, 6 ) == e );
swizzle に () が必要なこと以外は、glsl互換です。ただ、断念しました。
理由は、コンパイル速度が猛烈に遅いので、実用に耐えないことと、SIMDの効率的な使い方にめどが立たないためです(現在は、無理やり使っているという表現が近いです)。コンパイルが遅い理由は、swizzle の組みあわせを全て関数として実装しているため、xyzw(), xyzz(), wzyx() ... rgba(), argb(), aaar() ... 等組みあわせが爆発的に多いためです。
ソースコード:
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gslib/GSLib/Code/glsl_math/
テストコード:
http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/gslib/GSLib/Test/glsl_math/test_vec4.cpp