简介
我正在尝试使用废弃的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;
。