glCreateShaderがセグメンテーション違反を引き起こす


8

sfmlでシェーダーを使用しようとすると、シェーダーを作成できません。関数glCreateShader(GL_VERTEX_SHADER); セグメンテーション違反が発生します。最初にグーグルで調べたところ、プログラムがopenglコンテキストを持っていない場合にそうなることがわかりました。私は最初にSDLを試しましたが、不十分なドキュメントと「ヘッダーを見て何をすべきかを知る」ことでsfmlに行きました

セグメント障害の原因となるコードは次のとおりです

    sf::Window App(sf::VideoMode(800, 600, 32), "SFML OpenGL");

// Set color and depth clear value
glClearDepth(1.f);
glClearColor(0.f, 0.f, 0.f, 0.f);

// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);

// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

GLuint vertShader = glCreateShader(GL_VERTEX_SHADER);

    //...

gcc linuxでopengl 2.1を使用して、glew、gl.h、sfml-window、sfml-systemを含めています。

何が欠けている?

回答:


15

OpenGLの拡張機能、バージョンなどをチェックしていません。

GLenum err = glewInit();
if (err != GLEW_OK)
  exit(1); // or handle the error in a nicer way
if (!GLEW_VERSION_2_1)  // check that the machine supports the 2.1 API.
  exit(1); // or handle the error in a nicer way

このコードは、OpenGLコンテキストの作成、存在しない可能性のある関数を使用する前に実行する必要があります。GLEW Webページの詳細


glewInitは1を返し、glewGetString(err)は "1.6.0"を返します
ibrabeicker

その「1」の戻り値はGLEW_ERROR_NO_GL_VERSIONです。これは、OpenGLコンテキストがないことを意味します。'err'をglewGetString()に渡さないでください-エラーメッセージの印刷可能なバージョンを取得するためにglewGetErrorString()に渡してください。
Trevor Powell

コンストラクターをsf :: Windowに呼び出すときにコンテキストを作成する必要はありませんか?
ibrabeicker 2012年

私はSFMLを知らないので、そのライブラリでOpenGLコンテキストを作成するために何をする必要があるかわかりません(たぶん他の誰かが別の回答を投稿してその知識を埋めることができるでしょうか?)しかし、私はGLEWをたくさん使用しています、および投稿したエラー値は、glewInit()を呼び出した時点ではOpenGLコンテキストが作成されていなかったことを意味します。では、おそらく他に何かする必要があると思いますか?
Trevor Powell

私は彼らのウェブサイトでSFMLチュートリアルをフォローしました。私はあなたの答えを受け入れますが、どのようにopenglコンテキストを作成しますか?私もSDLで運が悪い
ibrabeicker 2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.