DerelictGL3`glCreateShader`访问违规

时间:2018-03-30 13:34:01

标签: opengl d derelict3

简介

我正在尝试使用Derelict's OpenGL binding在D中创建一个OpenGL着色器。在制作快速测试应用程序以查看是否可以将所有内容放在一起时,它工作得很好,但是当我开始组织更好的事情时,我遇到了一个非常奇怪的问题(就我对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。它是。这可以解释错误发生的原因。至于为什么null确实令我感到惊讶,考虑到两种情况下的进口都是相同的(包括混合物)。

1 个答案:

答案 0 :(得分:0)

正如@RichardAndrewCattermole所指出的那样,我在多个地方创建了同样东西的X副本,这无疑有些混淆了 Derelict GL3 包。实际上, Derelict according to the official documentation,它确实声明你应该使用glFreeFuncs将实现包装到它自己的文件中,这样你就可以在必要时要求它。

这样做消除了空指针。

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