C++入門者がOpenGLでハマったポイント〜環境構築(Ubuntu20.04 VSCode+GLFW+GLAD)
Webページや動画で紹介されているのはGLFWとGLADの組み合わせが多かったが初日にうまく構築出来なかったのでGLFW+GLEWの環境に逃げた。
1.GLFW + GLEWでもはまる
必要なパッケージはapt installで全部揃えることができた
sudo apt install libx11-dev sudo apt install xorg-dev sudo apt install libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev sudo apt install libglfw3 libglfw3-dev sudo apt install libglew-dev
makefile
makefileでglewを指定する際に小文字の-lglew
では/usr/bin/ld: -lglew
がみつかりませんとエラーになった。ファイル名が大文字だったので試しに-GLEW
にしたら通った
CXXFLAGS = -g -Wall -std=c++17 LDLIBS = -lGL -lglfw -lGLEW OBJECTS = $(patsubst %.cpp,%.o,$(wildcard *.cpp)) TARGET = sample .PHONY: clean $(TARGET): $(OBJECTS) $(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@ clean: -$(RM) $(TARGET) $(OBJECTS) *~ .*~ core
2.GLADではまる
GLAD1とGLAD2の違いを知らなかった
参考にしている解説のヘッダーがglad/glad.h
ならGLAD1、glad/gl.h
ならGLAD2でダウンロードページが異なり更に初期化の記述も異なる。ヘッダーオンリーではうまく行かなかったので以下のオプションのものを使用した
Options:
- ALIAS = False
- DEBUG = False
- HEADER_ONLY = False
- LOADER = True
- MX = False
- ON_DEMAND = False
CMakeLists.txtでプロジェクトへの追加ができなかった
GLADのgithubページに書かれたCMakeLists.txtではpython定義した関数が使用されていて理解の範疇を超えていたのでダメ元でライブラリとしてコンパイルするだけの記述をしたが動いている。message(STATUS "${変数}"
で地道に確認しながら作業を進めた。
gladがコンパイルされなかった
CMakeLists.txtの冒頭部分でproject(LearnOpenGL C CXX)
とCを追加していなかったためコンパイルされなかった。気がつくのに時間がかかった。
GLAD2(glad/gl.h)の初期化方法
GLAD2のgithubページで解説されている
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
これはGLAD1側の初期化法int version = gladLoadGL(glfwGetProcAddress);
こっちが正解
GLMが追加できなかった
チュートリアルが進むとGLMを使用してMatrixを扱うようになる。apt でインストールできるがCMakeLists.txtでglm
では認識されなかった。stackoverflowだったかがヒットしてglm::glm
で使えるようになった。なぜそうなのか?はわからない。
ディレクトリ構成
LearnOpenGL ├── CMakeLists.txt # main ├── glad │ ├── CMakeLists.txt # sub │ ├── include │ │ ├── KHR │ │ │ └── khrplatform.h │ │ └── glad │ │ └── gl.h │ └── src │ └── gl.c ├── include └── src └── main.cpp
mainのCMakeFileList.txt
cmake_minimum_required(VERSION 3.14) project(LearnOpenGL C CXX) set(PROJECT_VERSION 1.0.0) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED on) set(CMAKE_CXX_EXTENSIONS off) find_package(OpenGL REQUIRED) find_package(glfw3 REQUIRED) find_package(glm REQUIRED) add_subdirectory(glad) set(project_src src/main.cpp src/test.cpp src/shader.cpp ) set(project_headers ${CMAKE_CURRENT_SOURCE_DIR}/include/shader.hpp ${CMAKE_CURRENT_SOURCE_DIR}/include/test.hpp ) set(all_libs OpenGL glad glfw glm::glm X11 Xrandr pthread Xi dl ) add_executable(main ${project_src}) target_compile_options(main PUBLIC -Wall ) target_include_directories(main PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include/ ) target_link_libraries(main ${all_libs}) message(STATUS "CMAKE_DL_LIBS: ${CMAKE_DL_LIBS}")
sub側のCMakeLists.txt
file(GLOB SOURCES "src/*.c") add_library(glad STATIC ${SOURCES}) target_include_directories(glad PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ) message(STATUS "GLAD: SRCDIR - ${CMAKE_CURRENT_SOURCE_DIR}") message(STATUS "GLAD: SOURCES - ${SOURCES}")
3.まとめ
誰かの教えに従えばつまづきようのない環境構築でおよそ3日は悩まされた。今の所GLEWとGLADの違いがわからない。無理にGLAD使う必要もないような気がする。