C++入門者がOpenGLでハマったポイント〜ModelLoading辺り
頂点配列は正しいはずなのにキューブが崩れて表示される
前のセクションのコードを元にして次のセクションに向かうと描画が崩れる事が発生。新しく追加したコードから順に確認していくと最後にたどり着くのが頂点データの生配列だった。チュートリアルによってはポジション以外に法線、テクスチャ座標などがあったりなかったりするのが原因。
Texcoordsを使用しないのに配列に残していた場合glVertexAttribPointer
でセットした配列の解釈通りにいくとTexCoords
を想定した値が頂点座標として扱われ表示が崩れる。配列を変更しない場合はストライドを調整し3ではなく5*sizeof(float)にすれば良かったのかもしれない。
float vertices[] = { // position Texcoords -0.5f, -0.5f, -0.5f, 0.0f, 1.0f 0.5f, -0.5f, -0.5f, ..., ..., 0.5f, 0.5f, -0.5f, ..., ..., 0.5f, 0.5f, -0.5f, ..., ...,
assimpで警告発生
assimpというライブラリを使用して3Dモデルをロードする。
aptでインストールして
sudo apt-get update sudo apt-get install libassimp-dev
CMakeFileLists.txtでfind_package(assimp REQUIRED)
を試したらこんなログがでた
[cmake] CMake Warning (dev) at /usr/lib/x86_64-linux-gnu/cmake/assimp-5.0/assimpTargets.cmake:54 (if): [cmake] if given arguments: [cmake] [cmake] "ON" [cmake] [cmake] An argument named "ON" appears in a conditional statement. Policy CMP0012 [cmake] is not set: if() recognizes numbers and boolean constants. Run "cmake [cmake] --help-policy CMP0012" for policy details. Use the cmake_policy command to [cmake] set the policy and suppress this warning. [cmake] Call Stack (most recent call first): [cmake] /usr/lib/x86_64-linux-gnu/cmake/assimp-5.0/assimp-config.cmake:1 (include) [cmake] CMakeLists.txt:28 (find_package) [cmake] This warning is for project developers. Use -Wno-dev to suppress it. [cmake]
usr/lib
内のcmakeディレクトリでassimp用の.cmakeが自動生成された模様。該当する部分はこんな感じ
# Create imported target assimp::assimp if(ON) add_library(assimp::assimp SHARED IMPORTED) else() add_library(assimp::assimp STATIC IMPORTED) endif()
わからないのでWebを検索した。ubuntu20.04LTSでaptを使用してassimpをインストールした時に発生するらしい。どうにも出来ないのでスルーする。
discourse.choreonoid.org CMakeの警告に関する報告
複数のソースからstb_image.hをincludeできない
コメントにDo thisと書かれていたのでこれまで何も考えずに使用していたが、サンプルで複数のファイルにまたがってstb_image.h
を使うケースに遭遇してハマった
// Do this: // #define STB_IMAGE_IMPLEMENTATION // before you include this file in *one* C or C++ file to create the implementation.
#define STB_IMAGE_STATIC
という手段もあるらしいけど、適当な関数を作って回避した。動くけどこれが正しいのかわからない。
// model.cpp #define STB_IMAGE_IMPLEMENTATION #include "stb/stb_image.h" void set_flip_stbi(bool flag) { stbi_set_flip_vertically_on_load(flag); } // main.cpp set_flip_stbi(true);
またファイルのロードに失敗する
Makeで生成されるbuildディレクトリの実行ファイルを実行しているはずなのに。たまにロードに失敗する。原因はbuildディレクトリを削除して再生成したときに削除したbuildディレクトリに居るため../resource/xxx.obj
とか相対パスでたどり着けていない模様。
ここまでの感想
モデルをロードできると「おおっ」て何かを成し遂げた気分になるけど、まだ何もしていないという恐怖。
参考にしているWebサイト learnopengl.com