GameActivityとVulkanの環境構築
最小要件
MinimumSDK API 24 (Nougat Android 7.0)
AndroidNDK r12
build.gradle.ktsに下記を記述する
android {
compileSdk = 35
defaultConfig {
minSdk = 24
targetSdk = 35
}
}
buildFeatures {
prefab = true
}
}
dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.androidx.games.activity)
}
CMake.txtに下記を記述する
find_package(game-activity REQUIRED CONFIG)
target_link_libraries(${CMAKE_PROJECT_NAME}
vulkan
game-activity::game-activity_static
android
log)
MainActivity.kts
import android.os.Bundle
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.google.androidgamesdk.GameActivity
class MainActivity : GameActivity() {
companion object {
init {
System.loadLibrary("rayengine")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
hideSystemBarsForImmersiveMode()
}
private fun hideSystemBarsForImmersiveMode() {
val insetsController = WindowCompat.getInsetsController(window, window.decorView)
insetsController.hide(WindowInsetsCompat.Type.systemBars())
insetsController.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
Vulkan-Hppを使う
リポジトリからZIPファイルをダウンロードする場合
最小要件
CMake 3.10
C++ 11
Vulkan-HppリポジトリからZIPファイルをダウンロードしてください
このとき、VK_HEADER_VERSIONとタグの下三桁を一致させる必要があります
VK_HEADER_VERSIONは、includes/NDK/LLVM/vulkan/vulkan_core.hの66行目あたりに記載されています
分からなければタグを指定せずにダウンロードして設定を行い、コンパイルをすると発生するエラーのメッセージを読んでください
タグの検索窓にVK_HEADER_VERSIONを入力して選択します
Download ZIPを押下します
展開し、Vulkan-Hpp/vulkanディレクトリを残し、ほかのディレクトリを削除します
次にプロジェクトのルートディレクトリに"third_party"というディレクトリを作成してください
そこに抽出したVulkan-Hpp/vulkanをコピーします
ディレクトリ構成は以下のようになります
project_root
| .gitignore
| build.gradle.kts
| gradle.properties
| gradlew
| gradlew.bat
| local.properties
| settings.gradle.kts
+---.gradle
+---.idea
+---app
+---build
+---gradle
\---third_party
\---Vulkan-Hpp
\---vulkan
vulkan.cppm
vulkan.hpp
CMakeLists.txtを書き換えます
cmake_minimum_required(VERSION 3.10)
set(CXX_STANDARD 11)
set(CXX_STANDARD_REQUIRED ON)
set(THIRD_PARTY_DIR ../../../../third_party)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${THIRD_PARTY_DIR}/Vulkan-Hpp
)
この他にも使用したいライブラリがあるときはthird_partyディレクトリにコピーすれば管理が楽です
FetchContentを使用する場合
最小要件
CMake 3.11
C++ 11
FetchContent_MakeAvailable()は、FetchContent_Populate()でもよい
GIT_TAGには、VK_HEADER_VERSIONと一致するタグを指定する(もちろんコミットIDでもよい)
cmake_minimum_required(VERSION 3.11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
include(FetchContent)
FetchContent_Declare(
vulkan-hpp
GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Hpp.git
GIT_TAG v1.3.275
)
FetchContent_MakeAvailable(vulkan-hpp)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${vulkan-hpp_SOURCE_DIR}
)
または、Vulkan-Headersを用いることもできる
このリポジトリでは、vulkan-sdk-1.3.275.0とv1.3.275のようにコミットIDが同一でありながら別のタグを付けていることがある
よって、GIT_TAGはコミットIDにすると良い
include(FetchContent)
FetchContent_Declare(
vulkan-headers
GIT_REPOSITORY https://github.com/KhronosGroup/Vulkan-Headers.git
GIT_TAG 217e93c664ec6704ec2d8c36fa116c1a4a1e2d40 # VK_HEADER_VERSION == 275
)
FetchContent_MakeAvailable(vulkan-headers)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${vulkan-headers_SOURCE_DIR}/include
)
git submoduleを使用する場合
最小要件
CMake 3.10
C++ 11
git init
git switch -orphan main
git add .
git commit -m "initial commit"
mkdir submodule
cd submodule
git submodule add --depth 1 https://github.com/KhronosGroup/Vulkan-Hpp.git
git commit -m "add submodule Vulkan-Hpp"
cmake_minimum_required(VERSION 3.10)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(SUBMODULE_DIR ../../../../submodule)
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE
${SUBMODULE_DIR}/Vulkan-Hpp
)
VK_HEADER_VERSIONを一致させる
タグのみ取得してからタグを指定してチェックアウトしてください
cd submodule/Vulkan-Hpp
git sparse-checkout set vulkan
git fetch --tags
git checkout v1.3.275
cd ../../
git commit -m "checkout Vulkan-Hpp v1.3.275"
sparse-checkoutは、プロジェクトのリポジトリをクローンするたびに設定しなおす必要があります
git clone https://github.com/your-name/your-repository.git
cd your-repository
git submodule init
git submodule update --recommend-shallow --depth 1 --single-branch
cd submodule/Vulkan-Hpp
git sparse-checkout set vulkan
また、サブモジュールに対してgit submodule updateを実行するよりも前にgit sparse-checkout setを実行することはできません
よって、vulkanディレクトリのみクローンすることはできません
Discussion