[C++]『ゲームプログラミングC++』Chapter05 : SDLからOpenGLへの移行完了

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

Actor.hを修正することでAsteroidが動くようになりました。

GLEWおよびSDL関連ライブラリはHomebrewからインストール、SOILはGitHubから入手しビルドしました。

プログラム内で作業ディレクトリの変更さえできれば、IDEを使わなくても問題なく動作します。この本の想定読者はC++中級レベルなのでその点は大丈夫でしょう。

Apple Siliconでも正常に動作し一安心です。これでようやく次の章に進むことができます。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = -std=c++11
LDFLAGS = -lc++ -framework CoreFoundation -framework OpenGL

# includeパス(-I)
INCLUDE = -I./include/act -I./include/base -I./include/compo -I./include/etc \
-I/opt/homebrew/Cellar/sdl2/2.0.22/include -I/opt/homebrew/Cellar/sdl2_image/2.0.5/include \
-I/opt/homebrew/Cellar/glew/2.2.0_1/include -I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include \
-I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/opt/homebrew/Cellar/libpng/1.6.37/include \
-I/usr/local/include -I/code/cpp/mylib/include

# ライブラリ直接パス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf -lsoil -lpng16 \
/code/cpp/mylib/lib/split.dylib 

# ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.22/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/opt/homebrew/Cellar/libpng/1.6.37/lib \
-L/usr/local/lib \

# 実行ファイル設定
TARGET = Game
TARGETDIR = ./bin

# ソースコードパス
SRCROOT = ./src

# oファイルの出力ディレクトリ
OBJROOT = ./obj

# プロジェクト
PROJ = Chapter05_12

# ソースディレクトリのリスト化
SRCDIRS := $(shell find $(SRCROOT) -type d)

# ソースディレクトリから全てのcppファイルをリスト化
SRCS   = $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))

# cppファイルのリストからオブジェクトファイルをリスト化
OBJS   = $(addprefix $(OBJROOT), $(patsubst ./src%,%,$(SRCS:.cpp=.o)))

# oファイルの出力ディレクトリをリスト化
OBJDIRS   = $(addprefix $(OBJROOT), $(patsubst ./%,/%,$(SRCDIRS)))

# cppファイルからoファイル作成
$(OBJROOT)/%.o: $(SRCROOT)/%.cpp
	@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) $(OPTION) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)

[C++]『ゲームプログラミングC++』Chapter05 : テクスチャマッピング

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

テクスチャマッピングがほぼ完了しました。

有効エリアがWindowの右上に位置していましたが、Asteroid.cppを修正して全面に表示させました。

ただAsteroidに動きがないのでまだOpenGLへの移行完了ではありません。

NO IDEでの学習ですから作業ディレクトリが異なるなど色々微調整が必要ですが、何とか手の内に入れつつあります。

Vector2 randPos = Random::GetVector(Vector2::Zero,
		Vector2(1024.0f, 768.0f));
Vector2 randPos = Random::GetVector(Vector2(-512.0f, -384.0f),
		Vector2(512.0f, 384.0f));
修正前
修正後

[C++]『ゲームプログラミングC++』Chapter05 : 変換行列

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

座標や回転角度が違うスプライトコンポーネント20個を描画させました(P177)。

どうも本のようにはなりません。と言いますか、この辺りの本の説明は手抜きがひどいです。こちらで考えて色々手を入れないと説明だけでは立ち往生します。SDLからOpenGLへの移行という大事なところですから丁寧に説明してもらいたいです。

あまり深入りせず、次のテクスチャマッピングへ進みます。

この本は独学には向かないとつくづく思います。精通した方のアシストがないととても読み進められないでしょう。学校の教材としてはそれなりに使えるのかもしれません。

Matrix4::CreateSimpleViewProj(1024.f, 768.f)では20個のうち7個しか描画できていない
Matrix4::CreateSimpleViewProjのサイズを縦横各4倍にして20個あることを確認

[C++]『ゲームプログラミングC++』 Game::initSpriteVertsの追加

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

前回の続きです。

描画した図形が平行四辺形になっていましたが、長方形になるように修正しました。

ソースコードにGame::initSpriteVertsを追加して、Game::Initializeにも記入します。書籍本文中にこの関数がソースコードに存在するかのように書いていますが、そんなものはありません(P145)。Game::CreateSpriteVertsを参考に自分で作りました。

void Game::initSpriteVerts()
{
	float vertexBuffer[]={
		-0.5f,0.5f,0.0f,  //頂点0
		0.5f,0.5f,0.0f,   //頂点1
		0.5f,-0.5f,0.0f,  //頂点2
		-0.5f,-0.5f,0.0f  //頂点3
	};
	unsigned int indexBuffer[]={
		0,1,2,
		2,3,0
	};

	mSpriteVerts = new VertexArray(vertexBuffer, 4, indexBuffer, 6);
}

[C++]『ゲームプログラミングC++』Chapter05 : Apple Silicon搭載Macによるシェーダー読み込み

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, NO IDE]

Chapter5のOpenGL導入のところで数日滞っていました。

Apple SiliconからIntel CPUにハードを換え、さらにOSバージョンをMacOS 11 Big SurからMacOS 10.14 Mojaveへ下げることでXcodeのプロジェクトファイルがまともに動くようになりました。

外出用のMacBook 12inchをMojaveのままにしていたので何とか対応できました。こういうことに遭遇した時だけWindowsがうらやましくなります。

そして以下の流れでApple Silicon搭載機(Big Sur)で開発できるようにしました。

1.MojaveのXcodeでChapter5のシェーダー読み込みまでのコードを作成し、四角形を描画する(書籍P156)。
2.XcodeからNO IDE環境に移植して描画再現性確認。
3.さらにIntel CPU & Big Sur搭載機へ移植し、NO IDE環境にて描画再現性確認。
4.最後にApple Silicon & Big Sur搭載機へ移植し、NO IDE環境にて描画再現性確認。

これでApple Silicon & Big SurにてNO IDEの開発環境を構築できました。かなりの遠回りでしたが、先に進めてホッとしています。Xcodeでトラブルに見舞われたのが誤算でした。

Xcodeの時点で本とは異なり長方形ではなく平行四辺形に描画されていますが、とりあえず良しとします。

[C++]『ゲームプログラミングC++』Chapter05 : Intel Macへの移植

[Intel Mac, Big Sur 11.6.5, clang 12.0.0, no IDE]

前回の続きです。

検討中のコードをM1 MacからIntel Macへ移植しました。移植と言ってもソースコードはそのまま、Makefileの方はINCLUDEとLIBRARYを書き直しです。

その結果、UNSUPPORTEDの表示は消えましたが、Windowは白いままです。

# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
LDFLAGS = -lc++ -framework CoreFoundation -framework OpenGL

# includeパス(-I)
INCLUDE = -I./include/act -I./include/base -I./include/compo -I./include/etc \
-I/usr/local/Cellar/sdl2/2.0.22/include -I/usr/local/Cellar/sdl2_image/2.0.5/include \
-I/usr/local/Cellar/glew/2.2.0_1/include -I/usr/local/include/freetype2/freetype \
-I/usr/local/include/SOIL -I/usr/local/include -I/Volumes/DATA/code/cpp/mylib/include

# ライブラリ直接パス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew -lsdl2_mixer \
/mylib/lib/split.dylib

# ライブラリパス(-L)
LIBRARY_L = -L/usr/local/Cellar/sdl2/2.0.22/lib -L/usr/local/Cellar/sdl2_image/2.0.5/lib \
-L/usr/local/Cellar/glew/2.2.0_1/lib -L/usr/local/lib

# 実行ファイル設定
TARGET = Game
TARGETDIR = ./bin

# ソースコードパス
SRCROOT = ./src

# oファイルの出力ディレクトリ
OBJROOT = ./obj

# プロジェクト
PROJ = Chapter05_04

# ソースディレクトリのリスト化
SRCDIRS := $(shell find $(SRCROOT) -type d)

# ソースディレクトリから全てのcppファイルをリスト化
SRCS   = $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))

# cppファイルのリストからオブジェクトファイルをリスト化
OBJS   = $(addprefix $(OBJROOT), $(patsubst ./src%,%,$(SRCS:.cpp=.o)))

# oファイルの出力ディレクトリをリスト化
OBJDIRS   = $(addprefix $(OBJROOT), $(patsubst ./%,/%,$(SRCDIRS)))

# cppファイルからoファイル作成
$(OBJROOT)/%.o: $(SRCROOT)/%.cpp
	@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS)

# 全ソース・コンパイル&ビルド
.PHONY:all
all: clean $(OBJS) $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)

[C++]『ゲームプログラミングC++』Chapter05 : main関数修正

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, no IDE]

4/12の詰み報告から一歩前進しました。作業ディレクトリをhomeから実行ファイルのあるディレクトリに変更してShadersディレクトリにアクセスできるようにしました。

しかし起動はするものの画面は真っ白です。調べたところM1環境に問題があるようなので、Intel Macにて検討を継続します。

やはりこの本は初級者には手ごわすぎます。C++を一通り使いこなせる中級かつゲーム製作経験者がターゲットだと思います。

#include "Game.h"
#include "split.h" // 自製ライブラリ

split spt;
char tmp[256];

int main(int argc, char** argv)
{
	// 変更前の作業ディレクトリ確認
    getcwd(tmp, 256);
    cout << "変更前cwd: " << tmp << endl;

	// 作業ディレクトリ変更(実行ファイルのディレクトリ)
	int rtn = spt.chCWD(argv[0], '/', 0, -2);
    cout << rtn << endl ;

	// 変更後の作業ディレクトリ確認
    getcwd(tmp, 256);
    cout << "変更後cwd: " << tmp << endl;

	Game game;
	bool success = game.Initialize();
	if (success)
	{
		game.RunLoop();
	}
	game.Shutdown();
	return 0;
}
変更前cwd: /Users/[ユーザID]
0
変更後cwd: /Volumes/DATA_m1/code/cpp/gameprogcpp/Chapter05_04/bin
UNSUPPORTED (log once): POSSIBLE ISSUE: unit 0 GLD_TEXTURE_INDEX_2D is unloadable and bound to sampler type (Float) - using zero texture because texture unloadable

[C++]『ゲームプログラミングC++』Chapter03 ディレクトリ構成変更

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, no IDE]

cppファイルが13個フラットに並んでいると扱いにくいので、サブディレクトリに振り分けました。それに合わせてMakefileも書き換えました。

cppファイル関係図
# コンパイラ設定
COMPILER = clang++
DEBUG = -g

# フラグ設定
CPPFLAGS = $(shell pkg-config sdl2 --cflags --libs) -std=c++11
LDFLAGS = -lc++

# includeパス(-I)
INCLUDE = -I./include/act -I./include/base -I./include/compo -I/opt/homebrew/Cellar/sdl2/2.0.22/include \
-I/opt/homebrew/Cellar/sdl2_image/2.0.5/include -I/opt/homebrew/Cellar/glew/2.2.0_1/include \
-I/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/include -I/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/include -I/usr/local/include

# ライブラリ直接パス(-l)
LIBRARY_l = -lsdl2 -lsdl2_image -lglew  -lsdl2_mixer -lsdl2_ttf

# ライブラリパス(-L)
LIBRARY_L = -L/opt/homebrew/Cellar/sdl2/2.0.22/lib -L/opt/homebrew/Cellar/sdl2_image/2.0.5/lib \
-L/opt/homebrew/Cellar/glew/2.2.0_1/lib -L/opt/homebrew/Cellar/sdl2_mixer/2.0.4_3/lib \
-L/opt/homebrew/Cellar/sdl2_ttf/2.0.18_1/lib -L/usr/local/lib

# 実行ファイル設定
TARGET = Game
TARGETDIR = ./bin

# ソースコードパス
SRCROOT   = ./src

# oファイルの出力ディレクトリ
OBJROOT   = ./obj

# ソースディレクトリのリスト化
SRCDIRS := $(shell find $(SRCROOT) -type d)

# ソースディレクトリから全てのcppファイルをリスト化
SRCS   = $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.cpp))

# cppファイルのリストからオブジェクトファイルをリスト化
OBJS   = $(addprefix $(OBJROOT), $(patsubst ./src%,%,$(SRCS:.cpp=.o)))

# oファイルの出力ディレクトリをリスト化
OBJDIRS   = $(addprefix $(OBJROOT), $(patsubst ./%,/%,$(SRCDIRS)))

# cppファイルからoファイル作成
$(OBJROOT)/%.o: $(SRCROOT)/%.cpp
	@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
	$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<

# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
	$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY_l) $(LIBRARY_L) $(LDFLAGS) 

# コンパイル&ビルド
.PHONY:all
all: clean $(TARGET)

# oファイル・実行ファイル削除
.PHONY:clean
clean:
	rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)

[C++]『ゲームプログラミングC++』Chapter03 学習再開

[M1 Mac, Big Sur 11.6.7, clang 13.0.0, no IDE]

この本に関しては4/14以来の記事になります。2ヶ月ぶりに戻ってきました。

Chapter05で詰んでしまい学習を中断したのですが、あれからCMakeを習得するなどそれなりにスキルアップしたので再挑戦します。当時、調子に乗って買ってしまった”スタンフォード物理学再入門 力学”を少しは使おうという意図もあります。Chapter03から復習していきます。

後から見返すとそのプロジェクトを何のために作ったのか分からなくて少々困りました。テキストファイル名などに最低限の説明を残しておくべきですね。まだディレクトリ構成が定まっていないため、Gitは使っていません。

とりあえずライブラリの整理などビルドできる環境を再構築して、ゲームを作成し動かしてみました。