অ্যান্ড্রয়েডে ভলকান শেডার কম্পাইলার

একটি Vulkan অ্যাপকে অবশ্যই একটি OpenGL ES অ্যাপের থেকে আলাদাভাবে শেডারগুলি পরিচালনা করতে হবে: OpenGL ES-এ, আপনি একটি GLSL শেডার প্রোগ্রামের উত্স পাঠ্য গঠনকারী স্ট্রিংগুলির সেট হিসাবে একটি শেডার প্রদান করেন৷ বিপরীতে, Vulkan API-এর জন্য আপনাকে একটি SPIR-V মডিউলে একটি এন্ট্রি পয়েন্ট আকারে একটি শেডার প্রদান করতে হবে।

NDK রিলিজ 12 এবং পরবর্তীতে SPIR-V-এ GLSL কম্পাইল করার জন্য একটি রানটাইম লাইব্রেরি অন্তর্ভুক্ত। রানটাইম লাইব্রেরিটি Shaderc ওপেন সোর্স প্রজেক্টের মতই, এবং এর পিছনের প্রান্ত হিসাবে একই Glslang GLSL রেফারেন্স কম্পাইলার ব্যবহার করে। ডিফল্টরূপে, কম্পাইলারের Shaderc সংস্করণ ধরে নেয় আপনি Vulkan-এর জন্য কম্পাইল করছেন। আপনার কোড Vulkan-এর জন্য বৈধ কিনা তা পরীক্ষা করার পরে, কম্পাইলার স্বয়ংক্রিয়ভাবে KHR_vulkan_glsl এক্সটেনশন সক্রিয় করে। কম্পাইলারের Shaderc সংস্করণটি Vulkan-compliant SPIR-V কোডও তৈরি করে।

আপনি বিকাশের সময় আপনার ভলকান অ্যাপে SPIR-V মডিউলগুলি সংকলন করতে বেছে নিতে পারেন, একটি অনুশীলন যাকে বলা হয় আগাম-অব-টাইম , বা AOT , সংকলন। বিকল্পভাবে, রানটাইমের সময় প্রয়োজন হলে আপনি আপনার অ্যাপটি শিপড বা পদ্ধতিগতভাবে জেনারেট করা শেডার উত্স থেকে কম্পাইল করতে পারেন। এই অনুশীলনকে রানটাইম কম্পাইলিং বলা হয়। অ্যান্ড্রয়েড স্টুডিও ভলকান শেডার্স তৈরি করতে সমন্বিত সমর্থন করেছে।

এই পৃষ্ঠার বাকি অংশ প্রতিটি অনুশীলন সম্পর্কে আরও বিশদ প্রদান করে এবং তারপরে ব্যাখ্যা করে যে কীভাবে আপনার ভলকান অ্যাপে শেডার সংকলনকে একীভূত করতে হয়।

AOT সংকলন

শেডার AOT সংকলন অর্জনের দুটি উপায় রয়েছে, যা নিম্নলিখিত বিভাগে বর্ণিত হয়েছে।

অ্যান্ড্রয়েড স্টুডিও ব্যবহার করুন

app/src/main/shaders/ এ শেডার স্থাপন করা, Android স্টুডিও তাদের ফাইল এক্সটেনশন দ্বারা শেডারকে চিনতে পারে এবং নিম্নলিখিত ক্রিয়াগুলি সম্পূর্ণ করবে:

  • সেই ডিরেক্টরির অধীনে সমস্ত শেডার ফাইল পুনরাবৃত্তিমূলকভাবে কম্পাইল করুন।
  • কম্পাইল করা SPIR-V শেডার ফাইলে .spv প্রত্যয় যুক্ত করুন।
  • APK-এর assets/shaders/ ডিরেক্টরিতে SPIRV-শেডার প্যাক করুন।

অ্যাপ্লিকেশনটি রান টাইমে সংশ্লিষ্ট assets/shaders/ অবস্থান থেকে সংকলিত শেডার লোড করবে; সংকলিত এসপিভি শেডার ফাইলের কাঠামোটি app/src/main/shaders/ এর অধীনে অ্যাপ্লিকেশনটির GLSL শেডার ফাইল কাঠামোর মতোই।

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 কম্পাইল পতাকাগুলিকে গ্রেডেল ডিএসএল shaders ব্লকের ভিতরে কনফিগার করা যেতে পারে, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

গ্রোভি

android {
  defaultConfig {
    shaders {
      glslcArgs.addAll(['-c', '-g'])
      scopedArgs.create('lights') {
        glslcArgs.addAll(['-DLIGHT1=1', '-DLIGHT2=0'])
      }
    }
  }
}

কোটলিন

android {
  defaultConfig {
    shaders {
        glslcArgs += listOf("-c", "-g")
        glslcScopedArgs("lights", "-DLIGHT1=1", "-DLIGHT2=0")
    }
  }
}

glslcArgs সমস্ত shader সংকলনে প্রযোজ্য; scopedArgs শুধুমাত্র সেই সুযোগের জন্য কম্পাইল করার সময় প্রযোজ্য। উপরের উদাহরণটি একটি স্কোপ আর্গুমেন্ট lights তৈরি করে, যা শুধুমাত্র app/src/main/shaders/lights/ ডিরেক্টরির অধীনে GLSL শেডারের ক্ষেত্রে প্রযোজ্য হবে। উপলব্ধ সংকলন পতাকার সম্পূর্ণ তালিকার জন্য glslc পড়ুন। মনে রাখবেন যে NDK-এর ভিতরে Shaderc হল NDK প্রকাশের সময় সেই গিথুব রেপো থেকে একটি স্ন্যাপশট; পরবর্তী বিভাগে বর্ণিত glslc --help কমান্ডের সাহায্যে আপনি সেই সংস্করণের জন্য সঠিক সমর্থিত পতাকা পেতে পারেন।

অফলাইন কমান্ড-লাইন সংকলন

GLSL শেডার্স glslc কমান্ড-লাইন কম্পাইলার ব্যবহার করে প্রধান অ্যাপ্লিকেশন থেকে স্বাধীনভাবে SPIR-V তে কম্পাইল করা যেতে পারে। NDK রিলিজ 12 এবং পরবর্তীতে এই ব্যবহারের মডেলটিকে সমর্থন করার জন্য <android-ndk-dir>/shader-tools/ ডিরেক্টরিতে প্রাক-নির্মিত glslc এবং সম্পর্কিত সরঞ্জামগুলির একটি সংস্করণ প্যাক করে।

কম্পাইলার Shaderc প্রকল্প থেকে পাওয়া যায়; একটি বাইনারি সংস্করণ তৈরি করতে নির্দেশাবলী অনুসরণ করুন।

glslc একটি অ্যাপ্লিকেশনের জন্য বিভিন্ন প্রয়োজনীয়তা পূরণ করার জন্য shader সংকলনের জন্য কমান্ড-লাইন বিকল্পগুলির একটি সমৃদ্ধ সেট প্রদান করে।

glslc টুলটি একটি একক-উৎস ফাইলকে একটি একক শেডার এন্ট্রি পয়েন্ট সহ একটি SPIR-V মডিউলে কম্পাইল করে। ডিফল্টরূপে, আউটপুট ফাইলের নাম সোর্স ফাইলের মতোই থাকে, কিন্তু .spv এক্সটেনশন যুক্ত থাকে।

আপনি ফাইলের নাম এক্সটেনশন ব্যবহার করেন glslc টুলকে কোন গ্রাফিক্স শেডার স্টেজে কম্পাইল করতে হবে, বা একটি কম্পিউট শেডার কম্পাইল করা হচ্ছে কিনা। এই ফাইলের নাম এক্সটেনশনগুলি কীভাবে ব্যবহার করবেন এবং টুলের সাথে আপনি যে বিকল্পগুলি ব্যবহার করতে পারেন সে সম্পর্কে তথ্যের জন্য, glslc ম্যানুয়ালটিতে শেডার স্টেজ স্পেসিফিকেশন দেখুন।

রানটাইম সংকলন

রানটাইমের সময় শেডারগুলির JIT সংকলনের জন্য, NDK libshaderc লাইব্রেরি প্রদান করে, যেখানে C এবং C++ API উভয়ই রয়েছে।

C++ অ্যাপ্লিকেশনের C++ API ব্যবহার করা উচিত। আমরা সুপারিশ করি যে অন্যান্য ভাষার অ্যাপগুলি C API ব্যবহার করে, কারণ C ABI নিম্ন স্তরের, এবং আরও ভাল স্থিতিশীলতা প্রদান করার সম্ভাবনা রয়েছে।

নিম্নলিখিত উদাহরণ দেখায় কিভাবে C++ API ব্যবহার করতে হয়:

#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;
}

আপনার প্রকল্পে একীভূত

আপনি প্রজেক্টের Android.mk ফাইল বা Gradle ব্যবহার করে আপনার অ্যাপে Vulkan shader কম্পাইলারকে একীভূত করতে পারেন।

Android.mk

শেডার কম্পাইলারকে সংহত করতে আপনার প্রজেক্টের Android.mk ফাইল ব্যবহার করতে নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করুন৷

  1. আপনার Android.mk ফাইলে নিম্নলিখিত লাইনগুলি অন্তর্ভুক্ত করুন:
    include $(CLEAR_VARS)
         ...
    LOCAL_STATIC_LIBRARIES := shaderc
         ...
    include $(BUILD_SHARED_LIBRARY)
    
    $(call import-module, third_party/shaderc)
    
  2. অ্যাপের Application.mk-এ APP_STL-কে c++_static , c++_shared , gnustl_static বা gnustl_shared এর মধ্যে একটিতে সেট করুন

Gradle এর CMake ইন্টিগ্রেশন

  1. একটি টার্মিনাল উইন্ডোতে, ndk_root/sources/third_party/shaderc/ এ নেভিগেট করুন।
  2. NDK এর Shaderc তৈরি করতে নিম্নলিখিত কমান্ডটি চালান। আপনি ব্যবহার করেন এমন প্রতিটি NDK সংস্করণে আপনাকে শুধুমাত্র একবার এই কমান্ডটি চালাতে হবে:
    $ ../../../ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk \
    APP_STL:=<stl_version> APP_ABI=all libshaderc_combined
    

    এই কমান্ডটি <ndk_root>/sources/third_party/shaderc/-এ দুটি ফোল্ডার রাখে। ডিরেক্টরি গঠন নিম্নরূপ:

    include/
      shaderc/
        shaderc.h
        shaderc.hpp
    libs/
      <stl_version>/
        {all of the abis}
           libshaderc.a
    
  3. target_include_directories এবং target_link_libraries ব্যবহার করে জেনারেট করা অন্তর্ভুক্ত এবং libs যোগ করুন, যেমন আপনি সাধারণত অনুরূপ বহিরাগত লাইব্রেরির জন্য করেন। আপনার অ্যাপের STL প্রকার অবশ্যই stl_version এ উল্লিখিত stl প্রকারের একটির সাথে মিলবে। NDK c++_shared বা c++_static ব্যবহার করার পরামর্শ দেয়, যদিও gnustl_static এবং gnustl_shared ও সমর্থিত।

সর্বশেষ Shaderc পান

NDK-তে Shaderc এসেছে Android সোর্স ট্রি থেকে, যা আপস্ট্রিম Shaderc রেপোর একটি স্ন্যাপশট। আপনার যদি সর্বশেষ Shaderc প্রয়োজন হয়, বিশদ বিবরণের জন্য বিল্ড নির্দেশাবলী পড়ুন। উচ্চ-স্তরের পদক্ষেপগুলি নিম্নরূপ:

  1. সর্বশেষ Shaderc ডাউনলোড করুন:
    git clone https://github.com/google/shaderc.git
  2. আপডেট নির্ভরতা:
    ./utils/git-sync-deps
  3. বিল্ড Shaderc:
    <ndk_dir>/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk \
        APP_STL:=c++_static APP_ABI=all libshaderc_combined -j16
    
  4. আপনার বিল্ড স্ক্রিপ্ট ফাইলে আপনার নিজস্ব Shaderc বিল্ড ব্যবহার করার জন্য আপনার প্রকল্পটি কনফিগার করুন।