DerelictGL3 `glCreateShader` 访问冲突

DerelictGL3 `glCreateShader` Access Violation

简介

我正在尝试使用 Derelict's OpenGL binding 在 D 中创建 OpenGL 着色器。在制作一个快速测试应用程序以查看我是否可以将所有东西放在一起的过程中,它工作得很好,但是当我开始稍微更好地组织事情时,我 运行 变得非常奇怪(根据我对 D 的理解语言和绑定)错误。希望我只是在犯傻。

如果我在模块 spacegame.game.game 中调用 glCreateShader(GL_VERTEX_SHADER):

module spacegame.game.game;

import lib.window.stage;

import derelict.opengl;
import derelict.opengl.types;

mixin glFreeFuncs!(GLVersion.gl45);

/**
 * The game stage.
 */
class Game : Stage
{
    this ()
    {
        super();

        glCreateShader(GL_VERTEX_SHADER);
    }
}

效果很好!完全没有错误。另一方面,如果我要从上面的模块导入模块 lib.render.shaderprogram

module lib.render.shaderprogram;

import std.stdio;

import derelict.opengl;
import derelict.opengl.types;

mixin glFreeFuncs!(GLVersion.gl45);

void makeShader ()
{
    glCreateShader(GL_VERTEX_SHADER);

    writeln("I never output!");
}

并从我之前调用 glCreateShader 的构造函数中调用 makeShader 函数(虽然它有效),我收到以下错误:

object.Error@(0): Access Violation

据我所知,一切都一样,包括进口,对吧?由于 shaderprogram 模块仅从 game 模块导入,GL 上下文已经设置,如第一个示例。

我似乎无法理解的是为什么第一个示例可以工作,而第二个示例却不能。

这里有我不知道的 D 语言编译器魔法吗?任何正确方向的指示将不胜感激。

此外

在我之前提到的 "quick test application" 中,我没有任何问题将一个简单的三角形渲染到 GLFW window。如果我在第一个示例中描述的 Game class 中创建着色器程序,渲染确实有效。

但是对于分离,如果shader程序的创建能分离出来肯定更好。 ;-)

Edit:@RichardAndrewCattermole 建议我在第二个示例中验证指向 glCreateShader 的指针不是 null。这是。这可以解释为什么会发生错误。至于为什么它确实 null 让我感到惊讶,考虑到两种情况下的导入是相同的(包括 mixin)。

正如@RichardAndrewCattermole 指出的那样,我在多个地方创建了同一事物的 X 个副本,毫无疑问,这混淆了 Derelict GL3 包。实际上,Derelictaccording to the official documentation 确实声明您应该将使用 glFreeFuncs 的实现包装到它自己的文件中,以便您可以在必要时要求它。

这样做消除了空指针。

这意味着每当需要使用该库时,只需一个简单的 import gl; 就可以了。