Bir Vulkan uygulaması, gölgelendiricileri OpenGL ES uygulamasının yönettiğinden farklı şekilde yönetmelidir: OpenGL ES'de, bir komut dosyasının kaynak metnini oluşturan dize grubu olarak bir gölgelendirici sağlarsınız GLSL gölgelendirici programı. Vulkan API'si ise bunun aksine, SPIR-V modülünde bir giriş noktası biçimindedir.
NDK Sürüm 12 ve üzeri, GLSL'yi SPIR-V'de derlemek için bir çalışma zamanı kitaplığı içerir.
Çalışma zamanı kitaplığı,
Shaderc açık kaynak projesidir ve aynı
Şu şekilde Glslang GLSL referans derleyicisi:
arka uç. Varsayılan olarak
derleyici, Vulkan için derleme yaptığınızı varsayar. Kodunuzun geçerli olup olmadığını kontrol ettikten sonra
Derleyici Vulkan, KHR_vulkan_glsl
uzantısını otomatik olarak etkinleştirir. Shaderc
sürümü de Vulkan uyumlu SPIR-V kodu oluşturur.
Geliştirme sırasında SPIR-V modüllerini Vulkan uygulamanızda derleyebilirsiniz. zamanın ilerisinde veya AOT olarak bilinen derleme Alternatif olarak: uygulamanızın bunları gönderilmiş veya prosedür olarak oluşturulan gölgelendiriciden derlemesini sağlayabilirsiniz ne kadar kaynak yapacağınızı belirler. Bu uygulamaya çalışma zamanı derleme adı verilir. Android Studio, Vulkan gölgelendiricilerini oluşturmak için entegre desteğe sahiptir.
Bu sayfanın geri kalanında her alıştırma hakkında daha fazla ayrıntı verilmiş ve ardından gölgelendirici derlemesini Vulkan uygulamanıza nasıl entegre edeceğinizi.
AOT derlemesi
Gölgelendirici AOT derlemesinin iki yolu vardır. Bunlar aşağıda açıklanmıştır.
Android Studio'yu kullanma
Gölgelendiricileri app/src/main/shaders/
konumuna yerleştiren Android Studio, gölgelendiricileri şu ölçüte göre tanır:
kendi dosya uzantılarını görüntüleyecek ve aşağıdaki işlemleri gerçekleştirecektir:
- Tüm gölgelendirici dosyalarını bu dizin altında yinelemeli olarak derleyin.
- Derlenen SPIR-V gölgelendirici dosyalarına .spv son ekini ekleyin.
- SPIRV gölgelendiricilerini, APK'nın
assets/shaders/
dizinine paketleyin.
Uygulama, derlenen gölgelendiricileri çalışma zamanında karşılık gelen assets/shaders/
konumundan yükler; derlenen spv gölgelendirici dosya yapısı, app/src/main/shaders/
altındaki uygulamanın GLSL gölgelendirici dosya yapısıyla aynıdır:
AAsset* file = AAssetManager_open(assetManager, "shaders/tri.vert.spv", AASSET_MODE_BUFFER); size_t fileLength = AAsset_getLength(file); char* fileContent = new char[fileLength]; AAsset_read(file, fileContent, fileLength);
Shaderc derleme işaretleri, aşağıdaki örnekte gösterildiği gibi gradle DSL shaders
bloğunun içinde yapılandırılabilir:
Eski
android { defaultConfig { shaders { glslcArgs.addAll(['-c', '-g']) scopedArgs.create('lights') { glslcArgs.addAll(['-DLIGHT1=1', '-DLIGHT2=0']) } } } }
Kotlin
android { defaultConfig { shaders { glslcArgs += listOf("-c", "-g") glslcScopedArgs("lights", "-DLIGHT1=1", "-DLIGHT2=0") } } }
glslcArgs
tüm gölgelendirici derlemeleri için geçerlidir; scopedArgs
yalnızca derleme sırasında geçerlidir
düşünmesi gerekir. Yukarıdaki örnek, yalnızcalights
app/src/main/shaders/lights/
dizini altındaki GLSL gölgelendiricileri. Referans
Tam liste için glslc
mevcut derleme flag'leri. NDK içindeki Shaderc'in,
NDK yayın zamanı; "Yalnızca bu sürüm için desteklenen işaretleri
glslc --help
, sonraki bölümde açıklandığı gibi.
Çevrimdışı komut satırı derlemesi
GLSL Shader'lar, glslc komut satırı derleyicisi kullanılarak ana uygulamadan bağımsız olarak SPIR-V'de derlenebilir. NDK 12 ve sonraki sürümleri, önceden oluşturulmuş glslc ve
<android-ndk-dir>/shader-tools/
dizinindeki ilgili araçlarla birlikte kullanılamaz.
Derleyici Shaderc'ten de kullanılabilir. proje; İkili sürüm oluşturmak için buradaki talimatları uygulayın.
glslc, zengin bir kümesi sağlar komut satırı seçeneklerini kullanarak bir uygulamanın çeşitli gereksinimlerini karşılamasını sağlar.
glslc aracı, tek kaynaklı bir dosyayı tek bir gölgelendirici ile SPIR-V modülünde derler
giriş noktası. Varsayılan olarak çıkış dosyasının adı kaynak dosyanın adıyla aynı olur.
ancak .spv
uzantısı eklenmiştir.
glslc aracına hangi grafik gölgelendirici aşamasının derleneceğini bildirmek için dosya adı uzantılarını kullanırsınız, veya bir Compute gölgelendiricinin derlenip derlenmediğini kontrol etmenizi sağlar. Bu dosya adlarının nasıl kullanılacağıyla ilgili araçla kullanabileceğiniz uzantılar ve seçenekler hakkında Gölgelendirici aşama spesifikasyonu glslc kılavuzu.
Çalışma zamanı derlemesi
NDK, çalışma zamanı sırasında gölgelendiricilerin JIT derlemesi için libshaderc kitaplığını sağlar. API'yi kullanabilirsiniz.
C++ uygulamaları C++ API'sını kullanmalıdır. Diğer dillerdeki uygulamaların C ABI daha düşük seviyede olduğu ve daha iyi kararlılık sağlayabileceği için C API'yi kullanmamalıdır.
Aşağıdaki örnekte, C++ API'sinin nasıl kullanılacağı gösterilmektedir:
#include <iostream> #include <string> #include <vector> #include <shaderc/shaderc.hpp> std::vector<uint32_t> compile_file(const std::string& name, shaderc_shader_kind kind, const std::string& data) { shaderc::Compiler compiler; shaderc::CompileOptions options; // Like -DMY_DEFINE=1 options.AddMacroDefinition("MY_DEFINE", "1"); shaderc::SpvCompilationResult module = compiler.CompileGlslToSpv( data.c_str(), data.size(), kind, name.c_str(), options); if (module.GetCompilationStatus() != shaderc_compilation_status_success) { std::cerr << module.GetErrorMessage(); } std::vector<uint32_t> result(module.cbegin(), module.cend()); return result; }
Projelerinize entegre edin
Vulkan gölgelendirici derleyicisini, projenizin
Android.mk
dosyası veya Gradle.
Android.mk
Projenizin Android.mk
öğesini kullanmak için aşağıdaki adımları uygulayın
dosyasını yükleyin.
-
Android.mk dosyanıza aşağıdaki satırları ekleyin:
include $(CLEAR_VARS) ... LOCAL_STATIC_LIBRARIES := shaderc ... include $(BUILD_SHARED_LIBRARY) $(call import-module, third_party/shaderc)
-
APP_STL öğesini şu değerlerden biri olarak ayarlayın:
c++_static
,c++_shared
,gnustl_static
, veya uygulamanın Application.mk'sindegnustl_shared
Gradle'ın CMake entegrasyonu
-
Terminal penceresinde şuna gidin:
ndk_root/sources/third_party/shaderc/
-
NDK Shaderc'ini oluşturmak için aşağıdaki komutu çalıştırın. Bu komutu, kullandığınız her NDK sürümünde yalnızca bir kez çalıştırmanız gerekir:
$ ../../../ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk \ APP_STL:=<stl_version> APP_ABI=all libshaderc_combined
Bu komut <ndk_root>/sources/third_party/shaderc/ içine iki klasör yerleştirir. Dizin şu şekildedir:
include/ shaderc/ shaderc.h shaderc.hpp libs/ <stl_version>/ {all of the abis} libshaderc.a
-
Oluşturulan kapsayıcıları ve kitaplıkları kullanarak ekleyin
target_include_directories
vetarget_link_libraries
gibi, benzer reklamlarda yaptığınız gibi harici kitaplıklar. Uygulamanızın STL türü, şurada belirtilenstl
türlerinden biriyle eşleşmelidir:stl_version
. NDK,c++_shared
veyac++_static
ancakgnustl_static
vegnustl_shared
de desteklenir.
En yeni Shaderc sürümünü edinin
NDK'da Shaderc, Android Kaynak ağacından gelir. yukarı akış Shaderc deposunun anlık görüntüsü. En yeni Shaderc sürümüne ihtiyacınız varsa ayrıntılar için derleme talimatına bakın. Üst düzey adımlar şu şekildedir:
- En yeni Shaderc'i indirin:
git clone https://github.com/google/shaderc.git
- Bağımlılıkları güncelleyin:
./utils/git-sync-deps
- Shaderc'i oluşturun:
<ndk_dir>/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk \ APP_STL:=c++_static APP_ABI=all libshaderc_combined -j16
- Projenizi, derleme komut dosyası dosyanızda kendi Shaderc derlemenizi kullanacak şekilde yapılandırın.