derlectgl3`GlcreatHader`访问违规行为



简介

我正在尝试使用废弃的OpenGL绑定在D中创建一个OpenGL着色器。在制作快速测试应用程序以查看我是否可以将所有内容放在一起时,它效果很好,但是当我开始组织事情稍好时,我会遇到一个非常奇怪的(就我对D语言和绑定的理解而言(errror。希望我只是愚蠢。

如果我要在模块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!");
}

并从构造函数调用makeShader函数,我以前拨打glCreateShader(何时起作用(,我会收到以下错误:

object.Error@(0): Access Violation

据我所知,一切都是相同的,包括进口,对吗?由于仅从game模块导入shaderprogram模块,因此将已经设置了GL上下文,如第一个示例中。

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

我在这里不知道一些D语言编译器魔术吗?任何朝正确方向的指针都将不胜感激。

此外

在我之前提到的"快速测试应用程序"中,我没有任何问题将简单的三角形渲染到GLFW窗口。如果我在第一个示例中描述的Game类中创建着色器程序,则渲染确实有效。

对于分离,如果可以将阴暗器程序创建分开,那肯定会更好。; - (

编辑:@richardandrewcattermole建议我验证glCreateShader的指针在第二个示例中不是null。这是。这可以解释为什么发生错误。关于为什么null确实让我感到惊讶,考虑到这两种情况都相同(包括Mixin(。

@richardandrewcattermole指出,我在多个地方创建了同一事物的X副本,除了合理的疑问,这使得废弃的GL3 package混淆了。实际上,根据 derelict 的官方文档,它确实指出,您应该使用glFreeFuncs将实现包装到其自己的文件中,以便您可以在必要时要求。

这样做消除了空指针。

这意味着每当需要使用库时,就可以使用简单的import gl;

相关内容

  • 没有找到相关文章

最新更新