投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/11/28 06:12:18
# OpenGL は専門外なので、あまり具体的な回答はできないのですが。


> Public Class TessCall
>  Public Sub glEndCB()
>   glEnd()
>  End Sub
> End Class
これって、本当に GLU_TESS_VERTEX で使うためのメソッドですか?
End というからには、GLU_TESS_END で使う物にも見えるのですが…。


>  Public Delegate Sub CallCC() 'glEndCB()  'デリゲート 
引数無しの Sub なら、自身で Delegate を定義する代わりに、
MethodInvoker デリゲートをそのまま使う事もできます。
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.methodinvoker.aspx


> Public Function TessMake(ByVal ListNo As Integer) As Integer
引数 ListNo が使われていないのが気になります。


>  gluTessCallback(tobj, GLU_TESS_VERTEX, returnValue3)
今回、gluTessCallback の引数は、Declare にて
 ByVal IntPtr
 ByVal UInt32
 ByVal IntPtr
と定義されているのですよね。しかし、ここで渡している引数はそれぞれ
 Dim tobj As Integer = gluNewTess()
 GLU_TESS_VERTEX …… 記載が無いので不明
 Dim returnValue3 As IntPtr = Marshal.GetFunctionPointerForDelegate(New CallCC(AddressOf MyCall.glEndCB))
となっており、少なくとも、第一引数の型が違っているように見えます。
それぞれに渡す値の型は、Declare 宣言と合わせておいてください。



> Public Declare Sub gluTessCallback Lib "GLU32.DLL" (ByVal tess As IntPtr, _
>                             ByVal which As UInt32, ByVal fn As IntPtr)
宣言部に
 Public Declare Sub gluTessCallback Lib "GLU32.DLL" (ByVal tess As IntPtr, _
                          ByVal which As UInt32, ByVal fn As MethodInvoker)
を追加すれば、
 Dim tessellate As IntPtr = gluNewTess()
 gluTessCallback(tobj, GLU_TESS_VERTEX, AddressOf glEndCB)
と記述できるかと思います。動くかどうかは別として。



> CallCC のアドレスが渡ってないようです。
そもそも、GLU_TESS_VERTEX のコールバック関数は、
引数 0 個の Sub メソッドではなく、
引数 1 個の Sub メソッドではありませんでしたっけ?

(GLU_TESS_END のコールバック関数は引数 0 個)