ATMWRIによるUE5の記録

Unreal Engine 5 を使い始めました

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使う必要もないような気がする。