XR_ANDROID_light_estimation_cubemap

নাম স্ট্রিং

XR_ANDROID_light_estimation_cubemap

এক্সটেনশন টাইপ

ইনস্ট্যান্স এক্সটেনশন

নিবন্ধিত এক্সটেনশন নম্বর

৭২২

সংশোধন

অনুমোদনের অবস্থা

অনুমোদিত নয়

এক্সটেনশন এবং সংস্করণ নির্ভরতা

XR_ANDROID_light_estimation

সর্বশেষ সংশোধনের তারিখ

২০২৫-০৮-০৬

আইপি স্ট্যাটাস

কোনো জ্ঞাত আইপি দাবি নেই।

অবদানকারীরা

সালার খান, গুগল
স্কট চুং, গুগল
জ্যারেড ফাইন্ডার, গুগল
স্পেন্সার কুইন, গুগল
লেভানা চেন, গুগল
নিহাব জৈন, গুগল
ইয়ুর্গেন স্টর্ম, গুগল

সংক্ষিপ্ত বিবরণ

This extension builds upon the basic XR_ANDROID_light_estimation extension. It adds support for getting cubemap lighting estimates, which provides more detailed estimates about the lighting in the physical environment.

দ্রষ্টব্য

লাইট এস্টিমেট ডেটা পাওয়ার পদ্ধতিটি বেসিক এক্সটেনশনের মতোই, তবে লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার সময় XrCubemapLightEstimatorCreateInfoANDROID- কে XrLightEstimatorCreateInfoANDROID- এর সাথে চেইন করতে হবে।

সিস্টেমের সক্ষমতা পরীক্ষা করুন

typedef struct XrSystemCubemapLightEstimationPropertiesANDROID {
    XrStructureType    type;
    void*              next;
    XrBool32           supportsCubemapLightEstimation;
} XrSystemCubemapLightEstimationPropertiesANDROID;

সদস্যদের বিবরণ

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি পয়েন্টার। কোর OpenXR বা এই এক্সটেনশনে এই ধরনের কোনো স্ট্রাকচার সংজ্ঞায়িত করা নেই।
  • supportsCubemapLightEstimation হলো একটি XrBool32 , যা নির্দেশ করে যে বর্তমান সিস্টেমটি কিউবম্যাপ লাইট এস্টিমেশন সমর্থন করে কি না।

xrGetSystemProperties কল করার সময়, কোনো অ্যাপ্লিকেশন XrSystemProperties-কে XrSystemCubemapLightEstimationPropertiesANDROID স্ট্রাকচার দিয়ে এক্সটেন্ড করার মাধ্যমে সিস্টেমটি কিউবম্যাপ লাইট এস্টিমেশন সমর্থন করতে সক্ষম কিনা তা যাচাই করতে পারে

যদি রানটাইম supportsCubemapLightEstimation জন্য XR_FALSE রিটার্ন করে এবং XrCubemapLightEstimatorCreateInfoANDROID-কে XrLightEstimatorCreateInfoANDROID- এর সাথে চেইন করা হয়ে থাকে, তাহলে রানটাইমকে অবশ্যই xrCreateLightEstimatorANDROID থেকে XR_ERROR_FEATURE_UNSUPPORTED রিটার্ন করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

সমর্থিত কিউবম্যাপ রেজোলিউশনগুলি পাওয়া

XrResult xrEnumerateCubemapLightingResolutionsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    resolutionCapacityInput,
    uint32_t*                                   resolutionCountOutput,
    uint32_t*                                   resolutions);

প্যারামিটার বিবরণ

  • instance পূর্বে তৈরি করা একটি XrInstance
  • systemId হলো xrGetSystem দ্বারা পূর্বে প্রাপ্ত XrSystemId , যার জন্য সমর্থিত কিউবম্যাপ রেজোলিউশনগুলো পাওয়া যাবে।
  • resolutionCapacityInput হলো একটি uint32_t যা resolutions অ্যারেতে সংরক্ষণযোগ্য উপাদানের সর্বোচ্চ সংখ্যা নির্দেশ করে।
  • resolutionCountOutput হলো একটি uint32_t পয়েন্টার, যা রানটাইম দ্বারা সেট করা হয় এবং এটি resolutions অ্যারেতে রানটাইম কর্তৃক লিখিত উপাদানের সংখ্যা নির্দেশ করে।
  • resolutions is an array of uint32_t which is populated by the runtime with the supported cubemap resolutions.

একটি কিউবম্যাপ রেজোলিউশন কিউবম্যাপের প্রতিটি তলের প্রস্থ এবং উচ্চতা পিক্সেলে নির্দেশ করে। ২-কল ইডিওম অনুযায়ী, অ্যাপ্লিকেশনটি লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার সময় XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution এ সমর্থিত রেজোলিউশনগুলোর মধ্যে একটি ব্যবহার করার জন্য বেছে নিতে পারে । অ্যাপ্লিকেশনটিকে অবশ্যই নির্বাচিত রেজোলিউশন এবং কালার ফরম্যাটের উপর ভিত্তি করে XrCubemapLightingDataANDROID- এর ইমেজ বাফার মেম্বারগুলোর জন্য উপযুক্ত পরিমাণ মেমরি বরাদ্দ করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

  • xrEnumerateCubemapLightingResolutionsANDROID কল করার আগে XR_ANDROID_light_estimation_cubemap এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • instance অবশ্যই একটি বৈধ XrInstance হ্যান্ডেল হতে হবে
  • resolutionCountOutput অবশ্যই একটি uint32_t মানের পয়েন্টার হতে হবে।
  • যদি resolutionCapacityInput মান 0 না হয়, তাহলে resolutions অবশ্যই resolutionCapacityInput uint32_t মানগুলোর একটি অ্যারের পয়েন্টার হতে হবে।

রিটার্ন কোড

সাফল্য

  • XR_SUCCESS

ব্যর্থতা

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

সমর্থিত কিউবম্যাপ রঙের ফরম্যাটগুলি পাওয়া

XrCubemapLightingColorFormatANDROID এনুমারেশনটি রানটাইমকে জানিয়ে দেয় যে, কিউবম্যাপ লাইটিংয়ের জন্য কোন কালার ফরম্যাট ব্যবহার করতে হবে।

typedef enum XrCubemapLightingColorFormatANDROID {
    XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID = 1,
    XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID = 2,
    XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID = 3,
    XR_CUBEMAP_LIGHTING_COLOR_FORMAT_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrCubemapLightingColorFormatANDROID;

এনামগুলোর নিম্নলিখিত অর্থ রয়েছে:

এনামের বিবরণ

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID

৩টি চ্যানেল বিশিষ্ট একটি কালার ফরম্যাট, যেখানে প্রতিটি চ্যানেল হলো একটি ৩২-বিট ফ্লোটিং পয়েন্ট ভ্যালু।

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID

৪টি চ্যানেল বিশিষ্ট একটি কালার ফরম্যাট, যেখানে প্রতিটি চ্যানেল হলো একটি ৩২-বিট ফ্লোটিং পয়েন্ট ভ্যালু।

XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID

৪টি চ্যানেল বিশিষ্ট একটি কালার ফরম্যাট, যেখানে প্রতিটি চ্যানেল হলো একটি ১৬-বিট ফ্লোটিং পয়েন্ট ভ্যালু।

XrResult xrEnumerateCubemapLightingColorFormatsANDROID(
    XrInstance                                  instance,
    XrSystemId                                  systemId,
    uint32_t                                    colorFormatCapacityInput,
    uint32_t*                                   colorFormatCountOutput,
    XrCubemapLightingColorFormatANDROID*        colorFormats);

প্যারামিটার বিবরণ

  • instance পূর্বে তৈরি করা একটি XrInstance
  • systemId হলো xrGetSystem দ্বারা পূর্বে প্রাপ্ত XrSystemId , যার জন্য সমর্থিত কিউবম্যাপ রেজোলিউশনগুলো পাওয়া যাবে।
  • colorFormatCapacityInput হলো একটি uint32_t যা colorFormats অ্যারেতে সংরক্ষণযোগ্য উপাদানের সর্বোচ্চ সংখ্যা নির্দেশ করে।
  • colorFormatCountOutput হলো একটি uint32_t পয়েন্টার, যা রানটাইম দ্বারা সেট করা হয় এবং এটি colorFormats অ্যারেতে রানটাইম কর্তৃক লিখিত উপাদানের সংখ্যা নির্দেশ করে।
  • colorFormats হলো XrCubemapLightingColorFormatANDROID- এর একটি অ্যারে, যা রানটাইম দ্বারা সমর্থিত কিউবম্যাপ কালার ফরম্যাটগুলো দিয়ে পূরণ করা হয়।

২-কল ইডিওম অনুযায়ী , অ্যাপ্লিকেশনটি লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার সময় XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat এ সমর্থিত কালার ফরম্যাটগুলোর মধ্যে একটি ব্যবহার করার জন্য বেছে নিতে পারে । নির্বাচিত কালার ফরম্যাটের উপর ভিত্তি করে অ্যাপ্লিকেশনটিকে অবশ্যই XrCubemapLightingDataANDROID- এর ইমেজ বাফার মেম্বারগুলোর জন্য উপযুক্ত পরিমাণ মেমরি বরাদ্দ করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

  • xrEnumerateCubemapLightingColorFormatsANDROID কল করার আগে XR_ANDROID_light_estimation_cubemap এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • instance অবশ্যই একটি বৈধ XrInstance হ্যান্ডেল হতে হবে
  • colorFormatCountOutput অবশ্যই একটি uint32_t মানের পয়েন্টার হতে হবে।
  • যদি colorFormatCapacityInput 0 না হয়, তাহলে colorFormats অবশ্যই colorFormatCapacityInput XrCubemapLightingColorFormatANDROID মানগুলোর একটি অ্যারের পয়েন্টার হতে হবে।

রিটার্ন কোড

সাফল্য

  • XR_SUCCESS

ব্যর্থতা

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SIZE_INSUFFICIENT
  • XR_ERROR_SYSTEM_INVALID
  • XR_ERROR_VALIDATION_FAILURE

একটি কিউবম্যাপ লাইট এস্টিমেটর হ্যান্ডেল তৈরি করুন

typedef struct XrCubemapLightEstimatorCreateInfoANDROID {
    XrStructureType                        type;
    const void*                            next;
    uint32_t                               cubemapResolution;
    XrCubemapLightingColorFormatANDROID    colorFormat;
    XrBool32                               reproject;
} XrCubemapLightEstimatorCreateInfoANDROID;

সদস্যদের বিবরণ

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের দিকে নির্দেশকারী একটি পয়েন্টার।
  • cubemapResolution হলো একটি uint32_t যা কিউবম্যাপ লাইটিংয়ের জন্য ব্যবহৃত রেজোলিউশন নির্দেশ করে।
  • colorFormat হলো একটি XrCubemapLightingColorFormatANDROID, যা কিউবম্যাপ লাইটিং ডেটার জন্য ব্যবহৃত কালার ফরম্যাট নির্দেশ করে।
  • reproject হলো একটি XrBool32 যা নির্দেশ করে যে কিউবম্যাপের লাইটিংকে অ্যাপ্লিকেশন বেস স্পেসে রিপ্রজেক্ট করা হবে কিনা।

XrCubemapLightEstimatorCreateInfoANDROID স্ট্রাকচারটি একটি XrLightEstimatorANDROID হ্যান্ডেল তৈরি করার জন্য প্রয়োজনীয় তথ্য বর্ণনা করে, যা কিউবম্যাপ লাইটিং এস্টিমেট প্রদান করতে সক্ষম। XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution মেম্বারটিকে অবশ্যই xrEnumerateCubemapLightingResolutionsANDROID দ্বারা রিটার্ন করা রেজোলিউশনগুলোর মধ্যে একটিতে সেট করতে হবে। XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat মেম্বারটিকে অবশ্যই xrEnumerateCubemapLightingColorFormatsANDROID দ্বারা রিটার্ন করা কালার ফরম্যাটগুলোর মধ্যে একটিতে সেট করতে হবে। যদি অ্যাপ্লিকেশনটি রেজোলিউশনকে সাপোর্টেড রেজোলিউশনগুলোর মধ্যে একটিতে অথবা কালার ফরম্যাটকে সাপোর্টেড কালার ফরম্যাটগুলোর মধ্যে একটিতে সেট না করে, তাহলে রানটাইমকে অবশ্যই xrCreateLightEstimatorANDROID থেকে XR_ERROR_FEATURE_UNSUPPORTED রিটার্ন করতে হবে।

বৈধ ব্যবহার (অন্তর্নিহিত)

কিউবম্যাপ আলোর অনুমান

typedef struct XrCubemapLightingDataANDROID {
    XrStructureType                type;
    void*                          next;
    XrLightEstimateStateANDROID    state;
    uint32_t                       imageBufferSize;
    uint8_t*                       imageBufferRight;
    uint8_t*                       imageBufferLeft;
    uint8_t*                       imageBufferTop;
    uint8_t*                       imageBufferBottom;
    uint8_t*                       imageBufferFront;
    uint8_t*                       imageBufferBack;
    XrQuaternionf                  rotation;
    XrTime                         centerExposureTime;
} XrCubemapLightingDataANDROID;

সদস্যদের বিবরণ

  • type হলো এই স্ট্রাকচারটির XrStructureType
  • next হলো NULL অথবা একটি স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি পয়েন্টার। বৈধ স্ট্রাকচারগুলো হলো XrAmbientLightANDROID , XrSphericalHarmonicsANDROID , XrDirectionalLightANDROID
  • state হলো XrLightEstimateStateANDROID , যা আলোক অনুমানের অবস্থাকে নির্দেশ করে।
  • imageBufferSize হলো একটি uint32_t , যা কিউবম্যাপের প্রতিটি ফেস ইমেজ বাফারের বাইট সাইজ নির্দেশ করে।
  • imageBufferRight হলো একটি uint8_t বাফার, যা কিউবম্যাপটির ডান দিকের তলের ছবি ধারণ করে।
  • imageBufferLeft হলো একটি uint8_t বাফার, যা কিউবম্যাপটির বাম তলের ছবি ধারণ করে।
  • imageBufferTop হলো একটি uint8_t বাফার, যা কিউবম্যাপটির উপরের তলের ছবিটি ধারণ করে।
  • imageBufferBottom হলো একটি uint8_t বাফার, যা কিউবম্যাপটির নিচের তলের ছবি ধারণ করে।
  • imageBufferFront হলো একটি uint8_t বাফার, যা কিউবম্যাপটির সম্মুখভাগের ছবি ধারণ করে।
  • imageBufferBack হলো একটি uint8_t বাফার, যা কিউবম্যাপটির পেছনের দিকের ছবি ধারণ করে।
  • rotation হলো একটি XrQuaternionf যা কিউবম্যাপের ঘূর্ণন নির্দেশ করে।
  • centerExposureTime হলো একটি XrTime যা কিউবম্যাপটি ক্যাপচার করার সময় নির্দেশ করে।

এই স্ট্রাকচারটি XrLightEstimateANDROID- এর সাথে চেইন করা যেতে পারে । রানটাইমকে অবশ্যই xrGetLightEstimateANDROID- এ এই স্ট্রাকচারটি পপুলেট করতে হবে শুধুমাত্র যদি লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার জন্য XrCubemapLightEstimatorCreateInfoANDROID ব্যবহার করা হয়ে থাকে। অ্যাপ্লিকেশনটিকে অবশ্যই ইমেজ বাফারগুলির জন্য উপযুক্ত পরিমাণ মেমরি বরাদ্দ করতে হবে, যা লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার সময় XrCubemapLightEstimatorCreateInfoANDROID :: cubemapResolution এবং XrCubemapLightEstimatorCreateInfoANDROID :: colorFormat এ সেট করা মানগুলির উপর নির্ভরশীল। অ্যাপ্লিকেশনটিকে অবশ্যই XrCubemapLightingDataANDROID :: imageBufferSize কে প্রতিটি ফেস ইমেজ বাফারের ধারণক্ষমতা অনুযায়ী বাইটে সেট করতে হবে। যদি অ্যাপ্লিকেশনটি কিউবম্যাপ লাইট এস্টিমেশন ব্যবহার না করে অথবা রানটাইমের ইমেজ বাফারগুলি পূরণ করার জন্য XrCubemapLightingDataANDROID :: imageBufferSize যথেষ্ট বড় না হয়, তাহলে রানটাইমকে অবশ্যই XrCubemapLightingDataANDROID :: state কে XR_LIGHT_ESTIMATE_STATE_INVALID_ANDROID এ সেট করতে হবে।

যদি অ্যাপ্লিকেশনটি লাইট এস্টিমেটর হ্যান্ডেল তৈরি করার সময় XrCubemapLightEstimatorCreateInfoANDROID :: reproject XR_TRUE তে সেট করে, তাহলে রানটাইমকে অবশ্যই XrCubemapLightingDataANDROID :: rotation কে আইডেন্টিটি রোটেশনে সেট করতে হবে এবং নিশ্চিত করতে হবে যে অভ্যন্তরীণভাবে ঘোরানো কিউবম্যাপটি অ্যাপ্লিকেশন বেস স্পেসের একটি আইডেন্টিটি কিউবম্যাপের ফেসগুলোর উপর রিপ্রজেক্ট করা হয়েছে।

নিচের ছবিতে দেখানো অনুযায়ী, লাইটিং কিউবম্যাপের বিন্যাসটি OpenGL কিউবম্যাপের বিন্যাসের অনুরূপ।

XR অ্যান্ড্রয়েড আলো অনুমান কিউবম্যাপ লেআউট

চিত্র ২৪। কিউবম্যাপ লেআউট।

বৈধ ব্যবহার (অন্তর্নিহিত)

  • XrCubemapLightingDataANDROID ব্যবহার করার আগে XR_ANDROID_light_estimation_cubemap এক্সটেনশনটি অবশ্যই সক্রিয় করতে হবে।
  • type অবশ্যই XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID হতে হবে
  • next অবশ্যই NULL অথবা স্ট্রাকচার চেইনের পরবর্তী স্ট্রাকচারের একটি বৈধ পয়েন্টার হতে হবে।
  • state অবশ্যই একটি বৈধ XrLightEstimateStateANDROID ভ্যালু হতে হবে।
  • imageBufferRight অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferLeft অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferTop অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferBottom অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferFront অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferBack অবশ্যই imageBufferSize uint8_t মানের একটি অ্যারের পয়েন্টার হতে হবে।
  • imageBufferSize প্যারামিটারটি অবশ্যই 0 থেকে বড় হতে হবে।

আলো অনুমানের জন্য উদাহরণ কোড

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে রানটাইম থেকে আলোর অনুমানের সমস্ত সম্ভাব্য পরিমাণ পাওয়া যায়।

XrSession session;  // Created at app startup
XrInstance instance; // Created at app startup
XrSpace appSpace;   // Created previously.
XrSystemId systemId; // Retrieved previously by xrGetSystem
PFN_xrCreateLightEstimatorANDROID xrCreateLightEstimatorANDROID; // Created previously.
PFN_xrDestroyLightEstimatorANDROID xrDestroyLightEstimatorANDROID; // Created previously.
PFN_xrGetLightEstimateANDROID xrGetLightEstimateANDROID; // Created previously.
PFN_xrEnumerateCubemapLightingResolutionsANDROID xrEnumerateCubemapLightingResolutionsANDROID; // Created previously.
PFN_xrEnumerateCubemapLightingColorFormatsANDROID xrEnumerateCubemapLightingColorFormatsANDROID; // Created previously.

XrSystemCubemapLightEstimationPropertiesANDROID props = {
  .type = XR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID};
XrSystemProperties base = {.type = XR_TYPE_SYSTEM_PROPERTIES,
                           .next = &props};
CHK_XR(xrGetSystemProperties(instance, systemId, &base));
if (!props.supportsCubemapLightEstimation) {
   // Cubemap light estimation is not supported
}

uint32_t cubemapResolution = 0;
std::vector<uint32_t> supportedCubemapResolutions;
uint32_t resolutionCount;
CHK_XR(xrEnumerateCubemapLightingResolutionsANDROID(
  instance, systemId, 0, &resolutionCount, nullptr));
supportedCubemapResolutions.resize(resolutionCount);
if (resolutionCount == 0) {
  // No cubemap lighting supported
} else {
  CHK_XR(xrEnumerateCubemapLightingResolutionsANDROID(
    instance, systemId, 0, &resolutionCount, supportedCubemapResolutions.data()));
  cubemapResolution = supportedCubemapResolutions[0];
}

uint32_t pixelCount = cubemapResolution * cubemapResolution;

XrCubemapLightingColorFormatANDROID colorFormat;
std::vector<XrCubemapLightingColorFormatANDROID> supportedColorFormats;
uint32_t colorFormatCount;
CHK_XR(xrEnumerateCubemapLightingColorFormatsANDROID(
  instance, systemId, 0, &colorFormatCount, nullptr));
supportedColorFormats.resize(colorFormatCount);
if (colorFormatCount == 0) {
  // No supported color formats for cubemap lighting. Cannot use cubemap
  // light estimation.
} else {
  CHK_XR(xrEnumerateCubemapLightingColorFormatsANDROID(
    instance, systemId, 0, &colorFormatCount, supportedColorFormats.data()));
  colorFormat = supportedColorFormats[0];
}

uint32_t pixelSize = 0;
switch (colorFormat) {
  case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32_SFLOAT_ANDROID:
    pixelSize = 3 * sizeof(float);
    break;
  case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R32G32B32A32_SFLOAT_ANDROID:
    pixelSize = 4 * sizeof(float);
    break;
  case XR_CUBEMAP_LIGHTING_COLOR_FORMAT_R16G16B16A16_SFLOAT_ANDROID:
    pixelSize = 4 * sizeof(uint16_t);
    break;
  default:
    // Should not happen since the color format was validated previously.
    break;
}

uint32_t perFaceImageBufferSize = pixelCount * pixelSize;

XrLightEstimatorANDROID estimator;
XrCubemapLightEstimatorCreateInfoANDROID cubemapCreateInfo = {
    .type = XR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID,
    .cubemapResolution = cubemapResolution,
    .colorFormat = colorFormat,
    .reproject = XR_TRUE
};
XrLightEstimatorCreateInfoANDROID basicCreateInfo = {
    .type = XR_TYPE_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID,
    .next = &cubemapCreateInfo};
CHK_XR(xrCreateLightEstimatorANDROID(session, &basicCreateInfo, &estimator));

std::vector<uint8_t> cubemapBuffer(perFaceImageBufferSize * 6); // 6 faces * perFaceImageBufferSize

// Every frame
XrTime updateTime;  // Time used for the current frame's simulation update.

XrLightEstimateGetInfoANDROID info = {
    .type = XR_TYPE_LIGHT_ESTIMATE_GET_INFO_ANDROID,
    .space = appSpace,
    .time = updateTime,
};

XrCubemapLightingDataANDROID cubemap = {
    .type = XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID,
    .next = nullptr,
    .imageBufferSize = perFaceImageBufferSize,
    .imageBufferRight = cubemapBuffer.data() + 0 * perFaceImageBufferSize,
    .imageBufferLeft = cubemapBuffer.data() + 1 * perFaceImageBufferSize,
    .imageBufferTop = cubemapBuffer.data() + 2 * perFaceImageBufferSize,
    .imageBufferBottom = cubemapBuffer.data() + 3 * perFaceImageBufferSize,
    .imageBufferFront = cubemapBuffer.data() + 4 * perFaceImageBufferSize,
    .imageBufferBack = cubemapBuffer.data() + 5 * perFaceImageBufferSize,
};

XrDirectionalLightANDROID directionalLight = {
    .type = XR_TYPE_DIRECTIONAL_LIGHT_ANDROID,
    .next = &cubemap,
};

XrSphericalHarmonicsANDROID totalSh = {
    .type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
    .next = &directionalLight,
    .kind = XR_SPHERICAL_HARMONICS_KIND_TOTAL_ANDROID,
};

XrSphericalHarmonicsANDROID ambientSh = {
    .type = XR_TYPE_SPHERICAL_HARMONICS_ANDROID,
    .next = &totalSh,
    .kind = XR_SPHERICAL_HARMONICS_KIND_AMBIENT_ANDROID,
};

XrAmbientLightANDROID ambientLight = {
    .type = XR_TYPE_AMBIENT_LIGHT_ANDROID,
    .next = &ambientSh,
};

XrLightEstimateANDROID estimate = {
    .type = XR_TYPE_LIGHT_ESTIMATE_ANDROID,
    .next = &ambientLight,
};

XrResult result = xrGetLightEstimateANDROID(estimator, &info, &estimate);
if (result == XR_SUCCESS &&
    estimate.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
  // use cubemap, directionalLight, totalSh, ambientSh, and
  // ambientLight if each struct has a valid state field

  if (cubemap.state == XR_LIGHT_ESTIMATE_STATE_VALID_ANDROID) {
    // use cubemap
    if (cubemapCreateInfo.reproject == XR_TRUE) {
      XrQuaternionf identityQuaternion = {0.0f, 0.0f, 0.0f, 1.0f};
      assert(memcmp(&cubemap.rotation, &identityQuaternion, sizeof(XrQuaternionf)) == 0);
    }
  }
}

// When you want to disable light estimation
CHK_XR(xrDestroyLightEstimatorANDROID(estimator));

নতুন কমান্ড

নতুন কাঠামো

নতুন এনাম

নতুন এনাম ধ্রুবক

  • XR_ANDROID_LIGHT_ESTIMATION_CUBEMAP_EXTENSION_NAME
  • XR_ANDROID_light_estimation_cubemap_SPEC_VERSION
  • XrStructureType সম্প্রসারণ :

    • XR_TYPE_CUBEMAP_LIGHTING_DATA_ANDROID
    • XR_TYPE_CUBEMAP_LIGHT_ESTIMATOR_CREATE_INFO_ANDROID
    • XR_TYPE_SYSTEM_CUBEMAP_LIGHT_ESTIMATION_PROPERTIES_ANDROID

সমস্যা

সংস্করণ ইতিহাস

  • সংশোধন ১, ২০২৫-১২-০৫ (সালার খান)

    • প্রাথমিক এক্সটেনশনের বিবরণ