我正在尝试在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
答案 0 :(得分:0)
看起来像在谷歌搜索
&#34; struct GLUquadric&#34;
没有提供任何信息或线索......但是搜索
&#34; struct GLUquadric {&#34;
把我带到了我想要的地方:
我找到并使用了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函数隔离为gluQuadricDrawStyle
和gluQuadricNormals
,因此保留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*
类型。