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 函数传递或接收字符串,请不要弄乱字符编码。
既然您知道如何做到这一点,那就节省时间并找到一个可以为您做到这一点的图书馆。