OpenGL崩溃只是删除了std :: cout&lt;&lt;“hi”&lt; <std :: endl from =“”the =“”program

时间:2016-07-14 12:46:03

标签: c++ opengl glut

=“”

我发现了一个非常神秘的问题,我在程序和程序”segmentaion fault(core dumped)“中评论了 out 调试行。

我缩小了程序,然后来了。这是重现问题的整个代码:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <highgui.h>
#include <GL/glut.h>
#include <iostream>

int main(int argc, char **argv)
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGBA | GLUT_ALPHA | GLUT_DEPTH | GLUT_DOUBLE);
  glutInitWindowSize(500, 281);
  (void) glutCreateWindow("Alpha Test");

  cv::Mat image = cv::imread("alphatest.png");
  int texWidth = image.cols;
  int texHeight = image.rows;
  GLuint texId;
  glGenTextures(1, &texId);
  glBindTexture(GL_TEXTURE_2D, texId);

  //std::cout << "hi" << std::endl;

  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, image.ptr());
}

此程序在glTexImage2D崩溃并显示错误消息:

zsh: segmentation fault (core dumped)  ./mystery

(该程序被命名为神秘)

通过取消注释cout行,程序运行正常,没有错误以及消息“hi”。我想知道为什么我必须保留调试行?

这是alphatest.png enter image description here

1 个答案:

答案 0 :(得分:4)

您的图像行对齐很可能不符合OpenGL读取图像的默认设置(4字节行对齐)。这可能导致OpenGL从未映射的页面读取,从而导致段错误。在执行可能创建页面分配的iostream输出时,与图像缓冲区相邻,以便此问题保持“隐藏”。

测试一下:

glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);  /* tightly packed*/
glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); /* tightly packed*/
glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);   /* tightly packed*/
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);   /* tightly aligned*/
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, image.ptr());

此外,如果您的图像是灰度图像,那么读取GL_BGRA格式将比预期传送的数据更多。您不应该对这些参数进行硬编码,而是在imread返回时从图像文件中确定它们。

相关问题