介绍
我正在尝试使用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)。