1

介绍

我正在尝试使用Derelict 的 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让我感到惊讶,考虑到两种情况下的导入都是相同的(包括 mixin)。

4

1 回答 1

0

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

这样做消除了空指针。

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

于 2018-04-24T10:16:44.500 回答