ATMWRIによるUE5の記録

Unreal Engine 5 を使い始めました

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