私は非常に不思議な問題を発見しました私がプログラムとプログラムで持っているデバッグライン "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バイトの行アライメント)を満たしていない
'glut'の後に、有効なレンダリングOpenGLコンテキストを作成し、' gl'呼び出しの前に 'glewInit()'を呼び出すことによって 'glew'関数ポインタを初期化する必要があります。 – ampawd
@ampawd:glTexImage2Dは昔からの関数です。それはOpenGL-1.0以来のことです。 GLEWを必要としないことは確かです。 – datenwolf
@datenwolfええ、彼はいくつかの現代のgl関数 'glGenTexture'を呼び出す前に' glBindTexture'を正しく動作させるには 'glew'初期化が必要です。 – ampawd