使用 DllImport 在 C# 中调用 OpenGL 函数?

2024-04-05

我目前正在为 OpenGL 开发一个 C# 实用程序库。 对于跨平台窗口管理,我使用 GLFW,并使用 DllImport 成功加载了 glfwCreateWindow 或 glfwMakeContextCurrent 等函数。

现在我想使用 OpenGL,因为过去我主要使用 GLEW,所以我决定将它也用于我的 C# 项目。

所以我尝试使用 DllImport 进行 glewInit 并且成功了。 但是当我尝试对 glClear 等 OpenGL 函数执行相同的操作时,我收到一条错误消息,指出它找不到该函数。 我在glew头文件中查找了确切的函数名称和参数,但我认为我做得正确。 另外,我正在创建一个 OpenGL 上下文并在使用它之前调用 glewInit。

这是函数声明:

GLAPI void GLAPIENTRY glClear (GLbitfield mask);

这就是我从 C# 程序加载函数的方式:

[DllImport("GLEW dll path here")]
internal static extern void glClear(int mask);

是因为函数指针是在运行时加载的吗? 或者我加载函数时做错了什么?

我将不胜感激任何帮助/评论/提示。 如果您需要更多代码,我可以编辑帖子。

我对 stackoverflow 还很陌生,所以如果我做错了什么,请告诉我。


For glClear具体来说,以下内容就足够了:

[DllImport("opengl32.dll")]
public static extern void glClear(uint clearMask);

在 Windows 中 GL 函数定义在opengl32.dll并且应该从那里加载。但有一个警告:opengl32.dll仅与非常基本的 OpenGL 版本(1.1?不确定)兼容,并且不包含更新的 OpenGL 版本中可用的任何奇特功能(默认创建的上下文很可能与 v.4.x 兼容,但您根本不这样做)没有指向新函数的正确指针)。

在 C 或 C++ 中,您可以使用以下命令加载这些函数指针wglGetProcAddress https://msdn.microsoft.com/en-us/library/windows/desktop/dd374386(v=vs.85).aspx,但它很快就会变得非常笨重,这就是像 Glew 这样的库的用武之地:它们包含所有样板文件来声明和加载那些较新的 GL 函数。不幸的是,它对于 C# 来说不太有用:您仍然需要声明要在那里调用的方法,并且 Glew 不会以任何方式帮助您。

所以,假设你想打电话glCompileShader。为此,您需要能够致电wglGetProcAddress first:

[DllImport("opengl32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern IntPtr wglGetProcAddress(string functionName);

(您还需要确保在将 GL 上下文设置为当前的线程上调用它after上下文被设置为当前(即,之后wglMakeCurrent被调用),否则调用失败)

然后,声明委托:

delegate void GlCompileShaderDelegate(uint shader);

然后,加载函数地址:

IntPtr glCompileShaderPtr = GL.wglGetProcAddress("glCompileShader");
if (glCompileShaderPtr == IntPtr.Zero)
{
    // load failed
}

然后,将地址转换为委托:

GlCompileShaderDelegate glCompileShader = Marshal.GetDelegateForFunctionPointer<GlCompileShaderDelegate>(glCompileShaderPtr);

现在你可以打电话glCompileShader来自您的 C# 代码。冲洗并重复您想要调用的每个 GL 函数(除了那些在opengl32.dll当然),并且如果您从 OpenGL 函数传递或接收字符串,请不要弄乱字符编码。

既然您知道如何做到这一点,那就节省时间并找到一个可以为您做到这一点的图书馆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 DllImport 在 C# 中调用 OpenGL 函数? 的相关文章

随机推荐