我正在尝试使用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
确实令我感到惊讶,考虑到两种情况下的进口都是相同的(包括混合物)。
答案 0 :(得分:0)
正如@RichardAndrewCattermole所指出的那样,我在多个地方创建了同样东西的X副本,这无疑有些混淆了 Derelict GL3 包。实际上, Derelict 的according to the official documentation,它确实声明你应该使用glFreeFuncs
将实现包装到它自己的文件中,这样你就可以在必要时要求它。
这样做消除了空指针。
这意味着每当需要使用该库时,只需要一个简单的import gl;
即可。