0

OpenGl アプリケーションを構築しようとしています。最初に、古い固定関数パイプラインを描画に使用しました。その後、これが時代遅れであることに気付き、プログラマブル パイプラインに切り替えたいと考えました。この目的のために、Web 上のいくつかのチュートリアルを使用しました。コードを変更した後、コンパイルしようとしましたが、コンパイラは glShaderSource、glCompileShader、glCreateProgram、glAttachShader、glLinkProgram などの (コア プロファイル?) 関数を見つけることができませんでした。ウィンドウ管理などにGLFWライブラリを使用していませんが、xlibを使用しています。

glxinfo | grep OpenGl は以下を出力しています:

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GTX 675M/PCIe/SSE2
OpenGL core profile version string: 4.3.0 NVIDIA 331.113
OpenGL core profile shading language version string: 4.30 NVIDIA via Cg compiler
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 4.4.0 NVIDIA 331.113
OpenGL shading language version string: 4.40 NVIDIA via Cg compiler
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:

プロプライエタリな Nvidia ドライバーとオープン ソース ドライバーの両方を試しましたが、問題は解決しませんでした。

次の方法で OpenGl ヘッダーをインクルードします。

#include <GL/gl.h>
#include <GL/glx.h>

コンパイル エラー出力の一部を次に示します。

In file included from main.cpp:1:0:
../../gui/iml/app.window.h: In constructor    ‘gui::iml::AppWindow::AppWindow()’:
../../gui/iml/app.window.h:65:52: error: ‘glCreateShader’ was not declared in this scope
    fragmentShader = glCreateShader(GL_VERTEX_SHADER);
                                                ^
../../gui/iml/app.window.h:66:47: error: ‘glShaderSource’ was not declared in this scope
    glShaderSource(vertexShader,1,&vshader,NULL);
                                           ^
../../gui/iml/app.window.h:67:32: error: ‘glCompileShader’ was not declared in this scope
    glCompileShader(vertexShader);
                            ^
../../gui/iml/app.window.h:72:38: error: ‘glCreateProgram’ was not declared in this scope
    GLuint sprogram = glCreateProgram();
                                  ^
../../gui/iml/app.window.h:73:50: error: ‘glAttachShader’ was not declared in this scope
    glAttachShader(this->shaderProg,fragmentShader);
                                              ^
../../gui/iml/app.window.h:75:34: error: ‘glLinkProgram’ was not declared in this scope
    glLinkProgram(this->shaderProg);

デバッグ用に作成したテスト プログラムを次のようにコンパイルします。

g++ -Wall -Winline -DDEBUG main.cpp -I ../../gui/ -o debug -lX11 -lGL -lGLU -pthread -std=c++11

単純でばかげた間違いを犯したと思いますが、わかりません...

編集: gl.h ファイルを調べたところ、Mesa プロジェクトからのものであることがわかりました。

/*
 * Mesa 3-D graphics library
 *
 * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
 * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
 * 

これは Nvidia ドライバーのヘッダー ファイルではないでしょうか?

解決済み:

ここから gl3.h ヘッダー ファイルをダウンロードする必要がありました: https://www.khronos.org/registry/gles/api/old/3.0/gl3.hを /usr/include/GL/ に移動し ます

次に、次の方法で OpenEs 開発ファイルをインストールしました。

sudo apt-get install libgles2-mesa-dev

そして今、プログラムがコンパイルされます!

4

1 に答える 1

0

あなたの問題は表面的には解決しているかもしれませんが、実際には根本的な原因を解決していませんでした (少なくとも、LSB4 への準拠を目指している場合は、glShader だけを使用して運が良かったため、プログラムが実際に LSB5 に準拠している関数)。

あなたが直面している問題は、Linux Standards Base (LSB) が OpenGL-1.2 のみをシステム ABI に含まれる必須の関数セットとして定義していることです。*OpenGL-1.2 を超えるシンボルは、Linux デスクトップ システムで期待できる標準機能セットの一部ではありません。最近、要件を OpenGL-2.1 に引き上げる LSB5 がリリースされました。

とにかく、LSB で定義されているものの外にあるすべての関数は、実行時に動的に解決され、可用性がテストされる必要があります(繰り返す必要があります)。そうしないと、プログラム最終的に他の人のシステムで壊れます。

シンボルを解決するための関連関数はglXGetProcAddress(またはwglGetProcAddressWindows ではそれぞれ) です。…のプロトタイプ定義を有効にしないでくださいgl3.h。痛みと苦しみだけがその道を進んでいます。代わりに、作業を安全に行うために、GLEW (かなりの問題があります) やglLoadGen/glload (後者を使用することをお勧めします) など、適切にテストされた OpenGL ローダー ライブラリを使用してください。

于 2015-06-13T17:11:19.103 に答える