导入并使用openGL GLUQuadric?

时间:2016-05-04 02:05:26

标签: c# windows opengl

我正在尝试在C#中使用一些原生函数而不是OpenGL。 我需要绘制一个Sphere,然后我阅读了关于gluSphere并在GL \ glu.h上查看它,但收到一个struct对象作为参数:

<cfdump var="#GetHTTPRequestData()#">

我需要创建一个结构,以便将它发送到typedef struct GLUquadric GLUquadric; void APIENTRY gluSphere(GLUquadric *qobj,GLdouble radius,GLint slices,GLint stacks); 。 是否有一些地方或信息如何定义gluSphere所以我可以写它并将其发送到GLUquadric

gluSphere

2 个答案:

答案 0 :(得分:0)

看起来像在谷歌搜索

  

&#34; struct GLUquadric&#34;

没有提供任何信息或线索......但是搜索

  

&#34; struct GLUquadric {&#34;

把我带到了我想要的地方:

OGLES_GLU.h

我找到并使用了Struct,而WORKS是:

[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函数中绘制球体时,请勿调用gluDeleteQuadric(); 让GC执行此操作,只需声明一个新的GLUQuadric()并将其作为ref发送给gluSphere,否则您的程序中会出现内存问题。

赞美datenwolf在我的案例中无效的答案:

我的程序的实现是这样的:

[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);
        }

实现是完整的OO,因此每个Sphere都与静态GL函数隔离为gluQuadricDrawStylegluQuadricNormals,因此保留struct empty无效,因为它不会绘制任何内容。

答案 1 :(得分:0)

更大的问题是,如果你真的想要使用GLU。 GLU几十年来一直没有维护,也没有跟上OpenGL API的发展。 GLU不是OpenGL的一部分,它是由SGI与OpenGL一起开发并与OpenGL-1.1规范一起发布的伴随库。 GLU的第一个和最新版本仍然假定存在固定功能管道和立即绘图模式。两者都已从现代OpenGL中删除。

  

我需要创建一个结构,以便将其发送到gluNewQuadric。

实际上,没有必要知道这个结构中的内容。它被定义为不透明的指针类型。可以把它想象成一个没有接口的类实例句柄;你仍然可以将它传递给实现类的模块并在其上调用全局方法,但你无法查看内部。从C#的角度来看,它是指向某事的非托管指针。

编辑一个代码示例(我希望它是有效的C#)

[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);

如果您接受这些警告,我想知道将一些GLU实现移植到.net / CLI是否更有意义,以便可以在C#中本地使用它。

您当然也可以通过非托管接口访问GLU。现在我对C#的个人经历很少(我对F#有更多的经验)而且我从未离开管理场地做过无管理的事情。但是根据我的理解,你必须要做的只是定义一个足够大的整数变量来保持一个本机指针(如果我没有弄错,那么已经应该有这样一个整数类型了持有非托管指针)并将其用于GLUQuadric*类型。