代码之家  ›  专栏  ›  技术社区  ›  D. Ataro

DerelictGL3 `glCreateShader`访问冲突

  •  1
  • D. Ataro  · 技术社区  · 7 年前

    介绍

    我正在尝试使用 Derelict's OpenGL binding 。在制作一个快速测试应用程序以查看是否可以将所有内容组合在一起的过程中,它运行得很好,但当我开始稍微更好地组织事情时,我遇到了一个非常奇怪的错误(就我对D语言和绑定的理解而言)。但愿我只是在装傻。

    如果我打电话 glCreateShader(GL_VERTEX_SHADER) 在模块中 spacegame.game.game :

    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!");
    }
    

    打电话给 makeShader 我调用的构造函数中的函数 glCreateShader 在此之前(尽管有效),我得到以下错误:

    object.Error@(0): Access Violation
    

    就我所知,一切都是一样的,包括进口,对吗?作为 shaderprogram 模块仅从导入 game 模块中,GL上下文将已设置,如第一个示例中所示。

    我似乎无法理解的是,为什么第一个例子会起作用,而第二个却不起作用。

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

    此外

    在我之前提到的“快速测试应用程序”中,我在将简单三角形渲染到GLFW窗口时没有任何问题。如果我在 Game 第一个示例中描述的类。

    然而,对于分离,如果着色器程序的创建可以分离出来,那肯定会更好。;-)

    编辑 :@RichardAndrewCattermole建议我验证指向 glCreateShader 不是 null 在第二个示例中。是的。这可以解释为什么会发生错误。至于为什么 无效的 让我惊讶的是,考虑到这两种情况下的进口都是一样的(包括mixin)。

    1 回复  |  直到 7 年前
        1
  •  0
  •   D. Ataro    7 年前

    正如@RichardAndrewCattermole所指出的,我在多个地方创建了同一事物的X个副本,这无疑会混淆 废弃GL3 包裹实际上, according to the official documentation 属于 被遗弃的 ,它确实指出应该使用 glFreeFuncs 输入到自己的文件中,以便您可以在必要时要求。

    这样就消除了空指针。

    这意味着每当需要使用该库时 import gl; 这样才是所需要的。

    推荐文章