【问题标题】:OpenGL loading fails at seemingly random pointsOpenGL 加载在看似随机的点失败
【发布时间】:2021-12-30 04:17:02
【问题描述】:

我正在使用 LoadLibrary/GetProcAddress/wglGetProcAddress 在 C# 中加载 OpenGL。由于某种原因,它无法加载glBlendFunc 的指针,以及在那之后的其他随机指针。我一直在查看我的代码已经有一个小时的大部分时间了,所有这些失败的部分看起来都完全正常吗?

加载函数指针并将其转换为委托的代码。

    public override T GetFunction<T>(string name)
    {
        IntPtr pointer = wglGetProcAddress(name);
        if (pointer == IntPtr.Zero)
            pointer = GetProcAddress(Handle, name);
        return Marshal.GetDelegateForFunctionPointer<T>(pointer);
    }

调用GetFunction的代码示例。

 BlendEquationSeparate = Loader.GetFunction<glBlendEquationSeparate>("glBlendEquationSeparate");
 BlendEquationSeparatei = Loader.GetFunction<glBlendEquationSeparatei>("glBlendEquationSeparatei");
 BlendFunc = Loader.GetFunction<glBlendFunc>("glBlendFunc");
 BlendFunci = Loader.GetFunction<glBlendFunci>("glBlendFunci");
 BlendFuncSeparate = Loader.GetFunction<glBlendFuncSeparate>("glBlendFuncSeparate");
 BlendFuncSeparatei = Loader.GetFunction<glBlendFuncSeparatei>("glBlendFuncSeparatei");

委托代码示例。

public delegate void glBlendEquationSeparate(BlendEquationMode modeRGB, BlendEquationMode modeAlpha);
public static glBlendEquationSeparate BlendEquationSeparate;
public delegate void glBlendEquationSeparatei(UInt32 buf, BlendEquationMode modeRGB, BlendEquationMode modeAlpha);
public static glBlendEquationSeparatei BlendEquationSeparatei;
public delegate void glBlendFunc(BlendingFactorSrc sfactor, BlendingFactorDest dfactor);
public static glBlendFunc BlendFunc;
public delegate void glBlendFunci(UInt32 buf, BlendingFactorSrc sfactor, BlendingFactorDest dfactor);
public static glBlendFunci BlendFunci;
public delegate void glBlendFuncSeparate(BlendingFactorSrc srcRGB, BlendingFactorDest dstRGB, BlendingFactorSrc srcAlpha, BlendingFactorDest dstAlpha);
public static glBlendFuncSeparate BlendFuncSeparate;
public delegate void glBlendFuncSeparatei(UInt32 buf, BlendingFactorSrc srcRGB, BlendingFactorDest dstRGB, BlendingFactorSrc srcAlpha, BlendingFactorDest dstAlpha);
public static glBlendFuncSeparatei BlendFuncSeparatei;

我正在使用的 DllImports

[DllImport("kernel32")]
public static extern IntPtr LoadLibrary(string fileName);

[DllImport("kernel32")]
public static extern IntPtr GetProcAddress(IntPtr module, string procName);

[DllImport("opengl32.dll", EntryPoint = "wglGetProcAddress", ExactSpelling = true)]
public static extern IntPtr wglGetProcAddress(string lpszProc);

所有的枚举都是非常标准的,不需要上下文。我像往常一样加载库:LoadLibrary(opengl32.dll);。谁能向我解释我哪里出错了?

【问题讨论】:

  • 可能不是随机巧合:glBlendFunc 是通过GetProcAddress 代码路径的函数之一(遗留函数由 opengl32.dll 直接导出)。 GetProcAddress 可能中断的一个原因是使用了错误的 dllimport,你能证明这一点吗? (值得注意的是,“GetProcAddressC#”在谷歌上的热门搜索突出显示了一种错误的 dllimport 方式)
  • GetProcAddress 可能会中断的另一种方法是将错误的句柄传递给它,所以你能否也显示该代码(你在这里显示了一些 LoadLibrary 调用,但这不是真正的代码,所以我不能确保实际代码做正确的事)
  • @harold 我编辑了问题以包含 dllimports。
  • 好吧,看起来不错。那么Handle呢,你传入的是什么句柄呢?
  • @harold 我传入了 LoadLibrary 返回的句柄,来自“opengl32.dll”。

标签: c# .net opengl .net-6.0 wgl


【解决方案1】:

我找到了一个有点奇怪的解决方案。如果我将代码移动到静态构造函数中,使其在程序开始时运行,它会突然起作用。我不知道为什么我的第一种方法不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2012-12-27
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多