gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:51:11 25 4
gpt4 key购买 nike

我目前正在为 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 的新手,所以如果我做错了什么请告诉我。

最佳答案

具体来说,对于 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 加载这些函数指针,但它很快变得非常笨重,这就是像 Glew 这样的库的用武之地:它们包含所有样板文件来声明和加载那些较新的 GL 函数。不幸的是,它对 C# 的用处不大:您仍然需要声明要在那里调用的方法,Glew 不会以任何方式帮助您。

因此,假设您要调用 glCompileShader。为此,您需要能够先调用 wglGetProcAddress:

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

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

然后,声明委托(delegate):

delegate void GlCompileShaderDelegate(uint shader);

然后,加载函数地址:

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

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

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

现在您可以从 C# 代码中调用 glCompileShader。冲洗并重复您要调用的每个 GL 函数(当然 opengl32.dll 中的那些函数除外),如果您从OpenGL 函数。

现在您已经知道该怎么做了,为自己节省时间,找一个可以为您做这件事的图书馆吧。

关于c# - 使用 DllImport 在 C# 中调用 OpenGL 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com