看起來像谷歌的
「結構GLUquadric」 搜索
沒有給出任何信息或線索......但尋找
「 struct GLUquadric {「
帶我到我想要的地方:
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的功能繪製球體,不要叫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 ,因此每個球體都與靜態GL函數分離爲gluQuadricDrawStyle
和gluQuadricNormals
,所以將struct留空是無效的,因爲它不會畫任何東西。
這種方法的問題是,你不知道GLUquadric的內部存儲器佈局。你發現了* some * GLU實現的結構定義,但是你最終可能會在已安裝的GLU實現使用完全不同的結構佈局的系統上運行,並且如果發生這種情況,則調用C未定義的行爲,即** BAD * *(大寫鎖定所有大膽的壞)。 *永遠不要這樣做!*如果你這樣做,你正在進入一個痛苦的世界。 C代碼在調用UB時的態度的插圖:https://imgur.com/ZlB9kHD – datenwolf
正如我所說,這是工作和屬性是正確的。 我不需要更多的調用glu函數,因爲結構是*正確的* 發送此結構引用可以完全控制屬性,避免調用P/Invoke。 –
它只能巧妙地工作,因爲系統上的GLU的實現碰巧使用與您找到的結構佈局相同的結構佈局。但是,如果你更新你的操作系統,或者分發你的程序,你最終可能會在一個使用完全不同的內部結構佈局的系統上,然後*一切都會中斷。這真的很難理解嗎?你正在處理一個* opaque *數據類型。你不是不應該知道它在內部的外觀。實際上禁止做出任何假設。 – datenwolf