2016-07-14 11 views
1

私は非常に不思議な問題を発見しました私がプログラムとプログラムで持っているデバッグライン "segmentaionフォルト(コアダンプ) "OpenGLクラッシュはstd :: cout << "hi" << std :: endlをプログラムから取り除くことで

私はプログラムを絞り込んでこれに来ました。 cout行のコメントを外すこと

zsh: segmentation fault (core dumped) ./mystery 

(プログラムは謎と命名された)

:エラーメッセージが表示されてglTexImage2D

#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()); 
} 

このプログラムのクラッシュ:この問題を再現全体のコードですプログラムは、メッセージ「hi」と共にエラーなく正常に動作します。なぜ私はデバッグ行を維持する必要があるのだろうか?

そして、これはほとんどの場合、あなたのイメージの行揃えはOpenGLが画像を読み取るんれるデフォルトの設定(4バイトの行アライメント)を満たしていないenter image description here

+0

'glut'の後に、有効なレンダリングOpenGLコンテキストを作成し、' gl'呼び出しの前に 'glewInit()'を呼び出すことによって 'glew'関数ポインタを初期化する必要があります。 – ampawd

+1

@ampawd:glTexImage2Dは昔からの関数です。それはOpenGL-1.0以来のことです。 GLEWを必要としないことは確かです。 – datenwolf

+0

@datenwolfええ、彼はいくつかの現代のgl関数 'glGenTexture'を呼び出す前に' glBindTexture'を正しく動作させるには 'glew'初期化が必要です。 – ampawd

答えて

4

をalphatest.pngています。これにより、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配信よりも多くのデータを期待しています。これらのパラメータをハードコードするのではなく、imreadが返すときにイメージファイルからそれらのパラメータを決定するべきです。

+0

それは本当です!私の画像にはチャンネルが1つしかないので、読んで間違っています。そしてiostreamの説明に感謝します! – 5argon

関連する問題