我的电脑使用英特尔显卡运行Ubuntu 16.04。我使用Mesa 11.2作为我的OpenGL配置文件。
我简陋的OpenGL程序在窗口中显示一个简单的方块。如果按下某个键,我想让程序切换进出线框模式,所以我定义了以下回调函数:
true
不幸的是,在程序运行时按m会导致段错误。奇怪的是,在我的其他计算机上(运行Ubuntu 16.04但使用的是Nvidia GPU)我没有这样的问题,程序按预期工作。
问题不在nil
:我可以将其置于我的void keyCallback(GLFWwindow *window, int key, int scancode, int action, int mode) {
if (key == GLFW_KEY_ESCAPE and action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GL_TRUE);
}
if (key == GLFW_KEY_M and action == GLFW_PRESS) {
// Find the rasterizing mode.
GLint rastMode;
glGetIntegerv(GL_POLYGON_MODE, &rastMode);
// Switch modes depending on current rasterizing mode.
if (rastMode == GL_FILL) {
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
else {
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}
}
}
函数中,程序将成功切换模式。这些问题似乎与glPolygonMode
有关。如果我在main
函数中调用该函数(比如说,在游戏循环之外),我的方块将拒绝出现(尽管没有段错误)。
这里是完整的代码:
glGetIntegerv
答案 0 :(得分:2)
文档说:
params返回两个值:符号常量,指示前向和后向多边形是否被栅格化为点,线或填充多边形
结束@Wyzard和我的评论:glGetIntegerv(GL_POLYGON_MODE, &rastMode);
需要两个内存整数来写入。段错是由于写过rastMode int
解决方案是传递两个整数的缓冲区。