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