2008/12/12

bool型のマーシャリングのワナ

マネージコードでのbool(=System.Boolean)型の中身は
4バイトの整数(false=0, true=o以外)で、
慨定のマーシャリングの動作では4バイト整数としてアンマネージコードに渡される。

が、

OpenGLでのGLBoolean型は、調べてみると、
「1バイト符号無し整数」。
つまり、マーシャリング時に型の不一致が起こってバグる。
解決方法は、

(1)
[MarshalAs( UnmanagedType.U1 )] という属性を付加して、
boolが1バイト符号付き整数(true=1, false=0)に変換されるように指定する。

(2)
bool型の代わりにbyte型を使い、
true = 1, false = 0へ置き換える。

・・・のはずなんだけど、
(1)の方法で、bool[]型に、
[MarshalAs( UnmanagedType.LPArray, ArraySubType = UnmanagedType.I1 )]
という属性をつけてやってみたら、
どうもうまくいかない。
ArraySubType = UnmanagedType.U1でもダメだった。
1バイト整数に変換されず、4バイトのままアンマネージコードに渡されてるっぽい。
(2)の方法でbool[]の代わりにbyte[]を使うとうまくいく。
なんか属性の指定方法が間違ってるのだろうか?

2008/12/10

どう使うかが、難しい。

一応、バッファオブジェクトのクラス化はできた。
まぁ、ここまではそれほど難しくもない。
問題は、これをどう使うか。

前々から、GLSharpのMeshクラスを
もっとマシなものに作り直したいな、とは思っていて、
頂点配列(glVertexPointerとか)やバッファオブジェクトを使って
うまいことやってみたいな、とは考えているのだけれど、
さて、どうしたものか・・・。

2008/12/03

バッファオブジェクト

何となく気が向いたので、
バッファオブジェクトに手をつけてみることにした。
で、GLSharpへの実装も視野に入れて
赤本片手に、バッファオブジェクトを扱うクラスを試作中。

・・・といっても、まだバッファオブジェクトの扱い方すら
よくわかってないけど。

んん、OpenTKの
glBufferData、glSubBufferData関数のインポートが・・・

GL.BufferData( BufferTarget target, IntPtr size, IntPtr data, BufferUsageHint usage );
GL.BufferData( BufferTarget target, IntPtr size, object data, BufferUsageHint usage );
GL.BufferSubData( BufferTarget target, IntPtr offset, IntPtr size, IntPtr data );
GL.BufferSubData( BufferTarget target, IntPtr offset, IntPtr size, object data );

IntPtr型でサイズやオフセットを指定しろと?
いや、それはちと違うんでない?