[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 Shader module Vulkan Shader module이란? Vulkan Device에 의해 실행될 쉐이더 코드를 포함하는 리소스다. VkShaderModuleCreateInfo 구조체 typedef struct VkShaderModuleCreateInfo { VkStructureType sType; const void* pNext; VkShaderModuleCreateFlags flags; size_t codeSize; const uint32_t* pCode;} VkShaderModuleCreateInfo; 멤버 변수 설명 sType 구조체의 타입 pNext NULL 또는 확장 기능 구조체의 포인터 flags 일단 0을 사용… -
[Vulkan] VKSL 주의사항
[Vulkan] VKSL 주의사항
2024.09.10글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자입니다 목차 인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다. 😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기! VKSL 주의사항 GLSL 요구사항 Vulkan은 특정 버전 이상의 GLSL을 요구한다.SPIR-V로 컴파일하기 위해, GLSL은 #version 450이 권장되며, ESSL의 경우 최소 #version 310 es가 필요합니다. #version 300 esvoid main() {… -
[Vulkan] Hello fast clear
[Vulkan] Hello fast clear
2024.09.10 -
[Vulkan] Vulkan Framebuffer
[Vulkan] Vulkan Framebuffer
2024.09.10Vulkan Framebuffer는 그래픽스 파이프라인의 출력이 저장될 위치를 정의한 리소스다. 목차 인프런 삼각형님의 '삼각형의 실전! Vulkan 중급' 강의를 참고하였습니다. 😎 [삼각형의 실전! Vulkan 중급] 강의 들으러 가기! Vulkan Framebuffer Vulkan Framebuffer란? Vulkan Framebuffer는 그래픽스 파이프라인의 출력이 저장될 위치를 정의한 리소스다. (Vulkan의 Framebuffer는 OpenGL의 Framebuffer와 정확하게 동일하다.) Vulkan Framebuffer는 Vulkan Image view의 집합으로 구성된다. VkFramebufferCreateInfo 구조체 typedef struct VkFrame…
댓글을 사용할 수 없습니다.