[Vulkan] SPIR-V
SPIR-V (Standard Portable Intermediate Representation V)는 Vulkan의 Shader 언어다.
인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다.
😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기!
SPIR-V
SPIR-V란?
SPIR는 Standard Portable Intermediate Representation의 약어다. SPIR-V는 SPIR로부터 파생되었다.
SPIR-V는 Vulkan의 Shader 언어다.

SPIR-V가 Vulkan과 OpenCL에서 사용되기 시작하면서 그래픽스와 컴퓨팅 생태계의 모습이 근본적으로 변하게 될 것입니다. 특히 다양한 언어를 개발자들이 사용할 수 있기 때문입니다. 또한 벤더들은 드라이버 개발과 최적화에 집중을 할 수 있게 되었습니다.
- by Neil Trevett

다양한 언어가 SPIR로 컴파일되고 컴파일된 SPIR는 다양한 API에서 작동한다. 또한 SPIR는 LLVM을 기반이기 때문에 LLVM의 다양한 최적화 패스를 손쉽게 적용할 수 있다.
이러한 SPIR의 장점 덕분에 개발자들은 새로운 언어를 배우는데 시간을 소비하지 않고 코드 작성에 더 집중할 수 있다. 또한 Vendor들은 다양한 언어 복잡성을 관리하는 대신 코드 최적화에 더욱 집중할 수 있다.
SPIR-V 예시

shaderc 빌드
Vulkan Shader를 SPIR-V로 컴파일하기 위해 구글의 shaderc 라이브러리를 사용.

https://developer.android.com/ndk/guides/graphics/shader-compilers?hl=ko
Android의 Vulkan 셰이더 컴파일러 | Android NDK | Android Developers
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Android의 Vulkan 셰이더 컴파일러 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. Vulkan 앱은 OpenGL ES 앱과
developer.android.com
shaderc 사용법

코드
ShadercTest.kt 생성
package com.inflearn.practicevulkan import androidx.test.ext.junitgtest.GtestRunner import androidx.test.ext.junitgtest.TargetLibrary import org.junit.runner.RunWith @RunWith(GtestRunner::class) @TargetLibrary(libraryName = "shaderctest") class ShadercTest
build.gradle.kts 수정
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { namespace = "com.inflearn.practicevulkan" compileSdk = 34 defaultConfig { applicationId = "com.inflearn.practicevulkan" minSdk = 33 targetSdk = 34 versionCode = 1 versionName = "1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags += "-std=c++17" } } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { prefab = true } externalNativeBuild { cmake { path = file("src/main/cpp/CMakeLists.txt") version = "3.22.1" } } } dependencies { implementation("androidx.core:core-ktx:1.13.0") implementation("androidx.appcompat:appcompat:1.6.1") implementation("com.google.android.material:material:1.11.0") implementation("androidx.games:games-activity:1.2.2") implementation("androidx.test.ext:junit-gtest:1.0.0-alpha02") implementation("com.android.ndk.thirdparty:googletest:1.11.0-beta-1") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") }
코드 추가
- implementation("androidx.test.ext:junit-gtest:1.0.0-alpha02")
- implementation("cohttp://m.android.ndk.thirdparty:googletest:1.11.0-beta-1")
ShaderTest.cpp 생성
#include <sstream> #include <string> #include <string_view> #include <gtest/gtest.h> #include <shaderc/shaderc.hpp> TEST(shaderc, compile) { constexpr std::string_view code{ "#version 310 es\n" "void main() {" "}" }; shaderc::Compiler compiler; shaderc::CompileOptions options; auto result = compiler.CompileGlslToSpvAssembly( code.data(), code.size(), shaderc_vertex_shader, "test", options); EXPECT_EQ(result.GetCompilationStatus(), shaderc_compilation_status_success); std::string spv(result.cbegin(), result.cend()); std::istringstream iss(spv); std::string header; std::getline(iss, header); EXPECT_EQ(header, "; SPIR-V"); }
CMakeLists.txt 수정
# For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html cmake_minimum_required(VERSION 3.22.1) project("practicevulkan") #################################################################################################### # shaderc 정의 #################################################################################################### set(CMAKE_SHADERRC ${CMAKE_ANDROID_NDK}/sources/third_party/shaderc) add_library(shaderc INTERFACE) target_include_directories(shaderc INTERFACE ${CMAKE_SHADERRC}/include) target_link_libraries(shaderc INTERFACE ${CMAKE_SHADERRC}/libs/system/${CMAKE_ANDROID_ARCH_ABI}/libshaderc.a) #################################################################################################### # practicevulkan 정의 #################################################################################################### find_package(game-activity REQUIRED CONFIG) find_package(Vulkan REQUIRED) add_library(practicevulkan SHARED VkRenderer.h VkRenderer.cpp VkUtil.h main.cpp AndroidOut.cpp) target_compile_definitions(practicevulkan PRIVATE VK_USE_PLATFORM_ANDROID_KHR) target_link_libraries(practicevulkan game-activity::game-activity android log Vulkan::Vulkan shaderc) #################################################################################################### # shaderctest 정의 #################################################################################################### find_package(googletest REQUIRED CONFIG) find_package(junit-gtest REQUIRED CONFIG) add_library(shaderctest SHARED ShadercTest.cpp) target_link_libraries(shaderctest PRIVATE googletest::gtest junit-gtest::junit-gtest shaderc)
'⭐ Vulkan & CMake > Vulkan' 카테고리의 다른 글
[Vulkan] Vulkan Shader module (0) | 2024.09.10 |
---|---|
[Vulkan] VKSL 주의사항 (0) | 2024.09.10 |
[Vulkan] Hello fast clear (0) | 2024.09.10 |
[Vulkan] Vulkan Framebuffer (0) | 2024.09.10 |
[Vulkan] Vulkan Render pass (0) | 2024.08.16 |
댓글
이 글 공유하기
다른 글
-
[Vulkan] Vulkan Shader module
[Vulkan] Vulkan Shader module
2024.09.10 -
[Vulkan] VKSL 주의사항
[Vulkan] VKSL 주의사항
2024.09.10 -
[Vulkan] Hello fast clear
[Vulkan] Hello fast clear
2024.09.10 -
[Vulkan] Vulkan Framebuffer
[Vulkan] Vulkan Framebuffer
2024.09.10
댓글을 사용할 수 없습니다.