Android'de Vulkan gölgelendirici derleyicileri

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.

  1. 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)
    
    .
  2. APP_STL öğesini şu değerlerden biri olarak ayarlayın: c++_static, c++_shared, gnustl_static, veya uygulamanın Application.mk'sinde gnustl_shared

Gradle'ın CMake entegrasyonu

  1. Terminal penceresinde şuna gidin: ndk_root/sources/third_party/shaderc/
  2. 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
    
  3. Oluşturulan kapsayıcıları ve kitaplıkları kullanarak ekleyin target_include_directories ve target_link_libraries gibi, benzer reklamlarda yaptığınız gibi harici kitaplıklar. Uygulamanızın STL türü, şurada belirtilen stl türlerinden biriyle eşleşmelidir: stl_version. NDK, c++_shared veya c++_static ancak gnustl_static ve gnustl_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:

  1. En yeni Shaderc'i indirin:
    git clone https://github.com/google/shaderc.git
  2. Bağımlılıkları güncelleyin:
    ./utils/git-sync-deps
  3. 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
    
  4. Projenizi, derleme komut dosyası dosyanızda kendi Shaderc derlemenizi kullanacak şekilde yapılandırın.