2016-05-04 2 views
0

私はOpenGLと比べてC#でいくつかのネイティブ関数を使用しようとしています。OpenGL GLUQuadricをインポートして使用しますか?

typedef struct GLUquadric GLUquadric; 

void APIENTRY gluSphere(GLUquadric *qobj,GLdouble radius,GLint slices,GLint stacks); 

私はそれを送ることができるように構造体を作成する必要があります。私は球を描画する必要があると私はgluSphereについて読むとGLの\ glu.hにそれを見たが、パラメータとして構造体オブジェクトを受け取り gluSphereGLUquadricはどのように定義されているかの情報がありますか?それで書いてgluSphereに送ってください。

[StructLayout(LayoutKind.Sequential)] 
    struct GLUquadric{ 
      //What's here??? 
    } 

答えて

0

"構造体GLUquadric" をGoogleで検索するように見える

を探して任意の情報や手がかり...しかしを与えていません」構造体GLUquadric {"

は、私が望んでいた場所に連れて行ってくれました。私が発見し、使用してWORKS

OGLES_GLU.h

構造体は次のとおりです。

[StructLayout(LayoutKind.Sequential)] 
     public struct GLUquadric 
     { 
      int normals; 
      bool textureCoords; 
      int orientation; 
      int drawStyle; 
     } 

だから今、私は使用することができます。

[DllImport("glu32.dll")] 
static extern void gluSphere(ref GLUquadric qobj, double radius, int slices, int stacks); 
     public static void Sphere(ref GLUquadric qobject, double Radius, int Slices, int Stacks) 
     { 
      gluSphere(ref qobject, Radius, Slices, Stacks); 
     } 

OpenGLを今球体を描く。

注:インポートされたOpenGLの機能で球を描画するときに、他のあなたのプログラムでメモリの問題を持って、ちょうど新しいGLUQuadric()を宣言し、refgluSphereのようにそれを送る、それが仕事だ行うgluDeleteQuadric(); レッツGCを呼び出すことはありません。私のプログラムの実装がこの方法です

[StructLayout(LayoutKind.Sequential)] 
    public struct GLUquadric 
    { 
     int normals; 
     bool textureCoords; 
     int orientation; 
     int drawStyle; 

     public void Init(int norm, int draw, int orient, bool textCoor) 
     { 
      normals = norm; 
      drawStyle = draw; 
      orientation = orient; 
      textureCoords = textCoor; 
     } 
    } 

用途は以下のとおりです。

  public static void DrawSphere(T Radius, Int32 Slices, Int32 Stacks, 
      GLU.QuadricDrawStyles Style, GLU.QuadricNormals Normal, Color color) 
     { 
      OpenGL.SetColor(color); 
      GLU.GLUquadric quadric = new GLU.GLUquadric(); 
      quadric.Init((int)Normal, (int)Style, 0, false); 
      GLU.Sphere(ref quadric, (dynamic)Radius, Slices, Stacks); 
     } 

実装は、完全なオブジェクト指向である私の場合には有効ではありませんdatenwolfの答えを補完する

したがって、すべてのSphereは静的なGL関数からgluQuadricDrawStylegluQuadricNormalsとして隔離されているので、構造体を空のままにしても何も描画されないので有効ではありません。

+0

このアプローチの問題点は、GLUquadricの内部メモリのレイアウトがわからないことです。 *いくつかの* GLU実装の構造定義が見つかりましたが、インストールされたGLU実装が完全に異なる構造体レイアウトを使用するシステムになってしまった可能性があります。その場合、** BAD * *(大文字と小文字はすべて大胆に固定) *これをしないでください!*これを行うと、痛みの世界に入ります。 UBを呼び出すときのCコードの姿勢の説明:https://imgur.com/ZlB9kHD – datenwolf

+0

私が言ったように、これは動作しており、プロパティは正しいものです。 このstruct参照を送信すると、P/Invokeの呼び出しを避けるプロパティを完全に制御できます。 –

+0

システム上のGLUの実装は、見つかったものと同じ構造体レイアウトを使用するため、偶然によってのみ動作します。しかし、あなたのOSを更新したり、プログラムを配布したりすると、完全に異なる内部構造体レイアウトを使い、*すべてが破損するようなシステムになってしまうかもしれません。これは本当にあなたのために理解するのが難しいですか?ここでは、*不透明な*データ型を扱っています。あなたはそれが内部でどのように見えるかを知っているだけではありません。それは実際には何も仮定することが禁じられています。 – datenwolf

0

もっと大きな質問は、実際にGLUを使用したい場合です。 GLUは何十年も維持されておらず、OpenGL APIの開発に追いつかなかった。 GLUはOpenGL固有のものではなく、OpenGLとともにSGIによって開発され、OpenGL-1.1仕様とともに公開されるコンパニオンライブラリです。この最初の最新バージョンのGLUは、固定機能パイプラインと即時描画モードの存在を前提としています。両方とも最新のOpenGLから削除されました。

structを作成してgluNewQuadricに送信できるようにする必要があります。

実際には、この構造体内の内容を知る必要はありません。これは、不透明なポインタ型として定義されています。インターフェイスを持たないクラスインスタンスハンドルと考えることができます。クラスを実装するモジュールに渡して、グローバルメソッドを呼び出すことはできますが、内部を見ることはできません。 C#の観点からは、の何かがアンマネージドポインターで、何かです。

EDITのコード例では、それはいくつかのGLU実装に上のポートへのより多くの意味を成していないならば、あなたは、私は疑問に思うこれらの警告を受け入れた場合

[DllImport("glu32.dll")] 
static extern IntPtr gluNewQuadric(); 
[DllImport("glu32.dll")] 
static extern void gluDeleteQuadric(IntPtr quadric); 
[DllImport("glu32.dll")] 
static extern void gluSphere(IntPtr quadric, double radius, int slices, int stacks); 

IntPtr quadric = gluNewQuadric(); 
gluSphere(quadric, 1, 10, 10); 
gluDeleteQuadric(quadric); 

それ言われて(私は願っていることを、有効なC#があります) .net/CLIを使用して、C#からネイティブに使用できるようにします。

もちろん、アンマネージドインターフェイスを使用してGLUにアクセスすることもできます。今ではC#の私の個人的な経験はほとんどありません(私はF#でより多くの経験を持っています)、私は管理された根拠から管理されていないことをやっていません。しかし、あなたがしなければならないことを理解してから、を保持するのに十分な大きさの整数変数を定義するだけです。ネイティブポインタ(誤っていない場合、管理されていないポインタを保持するための整数型がすでに存在しているはずです) GLUQuadric*タイプです。

+0

情報をありがとう、私はすでにそれを知っているが、これは私の質問 –

+0

@c_strへの答えではないので、コメントとして投稿することができます:明らかにあなたは本当に私の答えを読んでいない。ネイティブGLUを使用する場合は、構造体の定義を知る必要はありません。これは不透明なポインタです。技術的には、それはハンドルのように動作します。あなたはgluNewQuadricを呼び出し、 "GLUquadric"構造体と呼ばれる "何か"へのポインタを返します。しかし、構造体の内部を見るはずがありません。実際の構造体レイアウトは未定であり、あなたが見つけた定義は、あなたの特定のGLUインストールが使用するものとはまったく異なっているかもしれません。それは、不透明なポインタがポインタの大きさの整数の中にあるだけの価値があります。 – datenwolf

+0

私はそれを読むが、それは私を助けていない、それは構造体がnullであるため動作しません、参照はnullになるので、私はOpenGLの図形を分離しています。私はgluSetQuadricNormalsもgluSetQuadricDrawStyleも呼びません。 私がしたことは、それらの機能から分離されています。構造体を空のままにすると、何も描画されません。構造体を作成すると、法線、ドロースタイル、向き、静的なdllインポート関数から分離されたテクスチャを変更して描画することができます。私の場合は構造体が必要です。 –

関連する問題