XR_EXT_spatial_container_self_rendering

নামের স্ট্রিং

XR_EXT_spatial_container_self_rendering

এক্সটেনশনের ধরন

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

রেজিস্টার করা এক্সটেনশন নম্বর

814

সংশোধন

1

অনুমোদনের স্ট্যাটাস

অনুমোদিত নয়

এক্সটেনশন ও ভার্সন ডিপেন্ডেন্সি

XR_EXT_spatial_container

শেষবার পরিবর্তন করার তারিখ

2026-08-06

IP স্ট্যাটাস

IP সংক্রান্ত কোনও দাবি নেই।

কন্ট্রিবিউটর

Lachlan Ford, Google
Andreas Loeve Selvik, Meta Platforms
Adam Gousetis, Meta Platforms
Bjorn Swenson, LÖVR
Cass Everitt, Meta Platforms
Christian Kruse, Meta Platforms
Denny Rönngren, Varjo Technologies
Fredia Huya-Kouadio, Godot Engine
Jakob Bornecrantz, NVIDIA
Jared Finder, Google
Jonathan Wright, Meta Platforms
Jian Zhang, ByteDance
Kurtis Eveleigh, Qualcomm
Mauricio Narvaez, Meta Platforms
Nick Klingensmith, Qualcomm
Nikita Lutsenko, Meta Platforms
Praveen Babu J D, ByteDance
Rylie Pavlik, Collabora
Salar Khan, Google
Shuai Liu, ByteDance
Walter Luh, Meta Platforms
Yin Li, Microsoft

এক নজরে

এই এক্সটেনশন স্পেশিয়াল কন্টেনারের জন্য "সেল্ফ রেন্ডারিং" নির্ধারণ করে। সেল্ফ রেন্ডার করা স্পেশিয়াল কন্টেনারের পিক্সেলগুলি একটি অ্যাপের মাধ্যমে তৈরি করা হয় এবং স্ট্যান্ডার্ড OpenXR সোয়াপচেন এবং কম্পোজিশন লেয়ার ব্যবহার করে রানটাইমে জমা দেওয়া হয়। যেহেতু স্পেশিয়াল কন্টেনার সবসময় স্ক্রিনের সব পিক্সেল ব্যবহার করে না, তাই রানটাইম প্রতিটি স্পেশিয়াল কন্টেনারের সাজেস্ট করা রেজোলিউশন ও ভিউ কনফিগারেশন সম্পর্কে অ্যাপকে জানায় যাতে অ্যাপ আরও দক্ষতার সাথে রেন্ডার করতে পারে।

এই এক্সটেনশনটি XR_EXT_spatial_container-এর সাথে একত্রিত হয়ে প্রচলিত OpenXR 1.x কোর কম্পোজিশন লেয়ার রেন্ডারিংয়ের ক্ষমতার একটি সুপারসেট অফার করার উদ্দেশ্যে তৈরি করা হয়েছে। OpenXR 1.x রানটাইম যা গ্রাফিক্যাল রেন্ডারিং এবং এই এক্সটেনশনকে সাপোর্ট করে, সেটিকে XrSystemSpatialContainerPropertiesEXT :: supportsImmersive-কে true হিসেবে সেট করতেই হবে যাতে বোঝা যায় যে এটি ইমারসিভ স্পেশিয়াল কন্টেনারকে সাপোর্ট করে।

স্পেশিয়াল কন্টেনার রেন্ডারিং লাইফসাইকেল

স্পেশিয়াল কন্টেনারের জন্য সেল্ফ রেন্ডারিং ব্যবহার করতে, xrCreateSpatialContainerEXT কল করার সময় অ্যাপ XrSpatialContainerCreateInfoEXT :: graphicsPresentation-কে XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT-এ সেট করে। তারপর, সেই অ্যাপ xrBeginSpatialContainerRenderingEXT এবং xrEndSpatialContainerRenderingEXT ফাংশন কল করে কোনও স্পেশিয়াল কন্টেনার অ্যাক্টিভভাবে রেন্ডার করছে কিনা তা ম্যানেজ করতে পারবে। এইসব ফাংশন xrBeginSession এবং xrEndSession-এর পরিবর্তে ব্যবহার করা হয়। এগুলি ফ্রেম-প্রতি অপারেশন নয়, যেমন xrBeginFrame এবং xrEndFrame।

প্রতিটি ফ্রেমে, একটি অ্যাপ নিম্নলিখিত ধাপগুলি অনুসরণ করে:

  • xrWaitFrame এবং xrBeginFrame কল করুন। এইসব ফাংশনের কোনও কন্টেনার-নির্দিষ্ট স্ট্রাকচার নেই এবং কোর স্পেসিফিকেশনে যেভাবে কাজ করে সেভাবেই কাজ করে।
  • xrLocateSpatialContainerViewsEXT-এর মাধ্যমে অ্যাক্টিভভাবে রেন্ডার করা সব স্পেশিয়াল কন্টেনারের জন্য ভিউ পোজ, প্রোজেকশন প্যারামিটার ও রেন্ডারিং সাজেশন ফিরিয়ে আনুন। প্রতিটি স্পেশিয়াল কন্টেনারের জন্য, রানটাইম রিপোর্ট করে যে সেটির কম্পোজিশন লেয়ার রেন্ডার করা উচিত কিনা এবং XrSpatialContainerViewStateEXT পূরণ করে লেয়ার রেন্ডার করার সাজেস্ট করা উপায়।
  • সাধারণত কম্পোজিশন লেয়ারে পিক্সেল রেন্ডার করুন। এইসব অপারেশনের কোনও কন্টেনার-নির্দিষ্ট স্ট্রাকচার নেই।
  • xrEndFrame কল করে এবং XrSpatialContainerLayerFrameEndInfoEXT চেইন করে অ্যাক্টিভভাবে রেন্ডার করা সমস্ত স্পেশিয়াল কন্টেনারের জন্য কম্পোজিশন লেয়ার জমা দিন।

XrSpatialContainerEXT হ্যান্ডেল ধ্বংস করলে, এটি অ্যাক্টিভ রেন্ডার সেট থেকে অন্তর্নিহিতভাবে সরিয়ে দেওয়া হয়। কোনও অ্যাপ স্পেশিয়াল কন্টেনার নষ্ট করে দিতে পারে, এমনকি সেটি xrBeginSpatialContainerRenderingEXT-এ সফলভাবে কল করলেও, যা xrEndSpatialContainerRenderingEXT-এ সংশ্লিষ্ট কলের সাথে যুক্ত নয়। রানটাইমকে অবশ্যই এমনভাবে কাজ করতে হবে যেন xrEndSpatialContainerRenderingEXT-কে ইমপ্লিসিটভাবে কল করা হয়েছে, যদি xrDestroySpatialContainerEXT-এর ইমপ্লিমেন্টেশনের শুরুতে প্রয়োজন হয় এবং এটি সফলভাবে রিটার্ন করে।

অ্যাক্টিভ রেন্ডার সেটে কোনও কন্টেনারের জন্য অ্যাপ XrEventDataSpatialContainerClosedEXT ইভেন্ট পেলে, সেই অ্যাপের xrEndSpatialContainerRenderingEXT কল করা এবং XrSpatialContainerEXT হ্যান্ডেল ধ্বংস করা উচিত।

xrBeginSpatialContainerRenderingEXT ফাংশনটি সেশন প্রতি অ্যাক্টিভ রেন্ডার সেটে স্পেশিয়াল কন্টেনার যোগ করে, যার ফলে কোনও অ্যাপ xrEndFrame-এ স্পেশিয়াল কন্টেনারের জন্য কম্পোজিশন লেয়ার জমা দিতে পারে।

XrResult xrBeginSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerBeginInfoEXT*       beginInfo);

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

অ্যাপ সাধারণত XrEventDataSpatialContainerVisibleChangedEXT :: visible-এর সাথে দৃশ্যমান-পরিবর্তিত ইভেন্টের উত্তরে এটিকে কল করে, যা 'সত্য' হিসেবে সেট করা থাকে।

xrCreateSpatialContainerEXT কল করার সময় XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT-এর মাধ্যমে স্পেশিয়াল কন্টেনার তৈরি করা না হলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT রিটার্ন করতেই হবে।

স্পেশিয়াল কন্টেনার আগে থেকেই অ্যাক্টিভ রেন্ডার সেটে থাকলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT রিটার্ন করতেই হবে।

অ্যাপ xrWaitFrame (অর্থাৎ, xrBeginFrame এবং xrEndFrame উইন্ডোর মধ্যে) কল করতে না পারার সময় xrBeginSpatialContainerRenderingEXT কল করা হলে, রানটাইমকে XR_ERROR_CALL_ORDER_INVALID রিটার্ন করতেই হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

  • xrBeginSpatialContainerRenderingEXT কল করার আগে XR_EXT_spatial_container_self_rendering এক্সটেনশন অবশ্যই চালু করতে হবে
  • session অবশ্যই একটি সঠিক XrSession হ্যান্ডেল হতে হবে
  • beginInfo অবশ্যই একটি সঠিক XrSpatialContainerBeginInfoEXT স্ট্রাকচারের পয়েন্টার হতে হবে

থ্রেড নিরাপত্তা

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
  • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED

XrSpatialContainerBeginInfoEXT স্ট্রাকচারটি স্পেশাল কন্টেনারের রেন্ডারিং শুরু করার জন্য প্যারামিটার নির্দিষ্ট করতে ব্যবহৃত হয়।

typedef struct XrSpatialContainerBeginInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrSpatialContainerEXT      spatialContainer;
    XrViewConfigurationType    primaryViewConfigurationType;
} XrSpatialContainerBeginInfoEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • spatialContainer হল রেন্ডারিং শুরু করার জন্য XrSpatialContainerEXT।
  • primaryViewConfigurationType হল প্রাথমিক XrViewConfigurationType যা স্পেশিয়াল কন্টেনারের জন্য ব্যবহার করা হবে।

primaryViewConfigurationType হল ভিউ কনফিগারেশন যা অ্যাপটি রেন্ডার করার সময় ব্যবহার করতে চায়। রানটাইম অপ্টিমাইজেশনের উদ্দেশ্যে ভিউ কনফিগারেশনকে কম ভিউ সহ একটি প্রকারে ক্ষয় করতে পারে (যেমন, একটি কন্টেনার অনেক দূরে এবং ছোট যাতে স্টেরিও অদৃশ্য থাকে)। xrLocateSpatialContainerViewsEXT-এ কল থেকে রানটাইম ক্ষয়প্রাপ্ত ভিউ কনফিগারেশন সম্পর্কে বিবরণ প্রদান করে।

সঠিক ব্যবহার (অন্তর্নিহিত)

xrEndSpatialContainerRenderingEXT ফাংশন অ্যাক্টিভ রেন্ডার সেট থেকে স্পেশিয়াল কন্টেনার সরিয়ে দেয়।

XrResult xrEndSpatialContainerRenderingEXT(
    XrSession                                   session,
    const XrSpatialContainerEndInfoEXT*         endInfo);

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

অ্যাপ সাধারণত XrEventDataSpatialContainerVisibleChangedEXT :: visible false-এ সেট করা সহ দৃশ্যমান-পরিবর্তিত ইভেন্টের উত্তরে এটি কল করে।

স্পেশিয়াল কন্টেনার অ্যাক্টিভ রেন্ডার সেটে না থাকলে, রানটাইম অবশ্যই XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT রিটার্ন করবে।

অ্যাপ xrWaitFrame কল করতে না পারার সময় (অর্থাৎ, xrBeginFrame এবং xrEndFrame কলের মধ্যবর্তী সময়ে) xrEndSpatialContainerRenderingEXT কল করা হলে, রানটাইম অবশ্যই XR_ERROR_CALL_ORDER_INVALID রিটার্ন করবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

  • xrEndSpatialContainerRenderingEXT কল করার আগে XR_EXT_spatial_container_self_rendering এক্সটেনশন অবশ্যই চালু করতে হবে
  • session অবশ্যই একটি সঠিক XrSession হ্যান্ডেল হতে হবে
  • endInfo অবশ্যই একটি সঠিক XrSpatialContainerEndInfoEXT স্ট্রাকচারের পয়েন্টার হতে হবে

থ্রেড নিরাপত্তা

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

  • XR_ERROR_CALL_ORDER_INVALID
  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_VALIDATION_FAILURE

XrSpatialContainerEndInfoEXT স্ট্রাকচারটি স্পেশিয়াল কন্টেনারের রেন্ডারিং শেষ করার জন্য প্যারামিটার নির্দিষ্ট করতে ব্যবহৃত হয়।

typedef struct XrSpatialContainerEndInfoEXT {
    XrStructureType          type;
    const void*              next;
    XrSpatialContainerEXT    spatialContainer;
} XrSpatialContainerEndInfoEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • spatialContainer হল রেন্ডারিং শেষ করার জন্য XrSpatialContainerEXT।

সঠিক ব্যবহার (অন্তর্নিহিত)

xrLocateSpatialContainerViewsEXT-এর মাধ্যমে ভিউ লোকেট করা হচ্ছে

xrLocateSpatialContainerViewsEXT ফাংশন স্পেশিয়াল কন্টেনারের সেটের জন্য ভিউ লোকেট করে।

XrResult xrLocateSpatialContainerViewsEXT(
    XrSession                                   session,
    const XrSpatialContainerViewsLocateInfoEXT* locateInfo,
    uint32_t                                    viewStateCount,
    XrSpatialContainerViewStateEXT*             viewStates,
    uint32_t                                    viewCount,
    XrView*                                     views);

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

  • session হল XrSession .
  • locateInfo হল XrSpatialContainerViewsLocateInfoEXT স্ট্রাকচারের একটি পয়েন্টার।
  • viewStateCount হল viewStates অ্যারের সংখ্যা।
  • viewStates হল XrSpatialContainerViewStateEXT স্ট্রাকচারের একটি অ্যারের পয়েন্টার যা রানটাইম দ্বারা পপুলেট করা হবে।
  • viewCount হল views অ্যারের সংখ্যা।
  • views হল XrView স্ট্রাকচারের অ্যারের একটি পয়েন্টার।

এই ফাংশন xrLocateViews-এর পরিবর্তে কাজ করে, যা কোনও অ্যাপকে একসাথে একাধিক স্পেশিয়াল কন্টেনারের জন্য ভিউ কোয়েরি করার অনুমতি দেয়।

সব স্পেশিয়াল কন্টেনারের ভিউ একটি views অ্যারেতে দেখানো হয়। ভিউগুলি XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos অ্যারেতে স্পেশিয়াল কন্টেনারের ইন্ডেক্সের উপর ভিত্তি করে সাজানো হয়, তারপর সেই কন্টেনারের ভিউ ইন্ডেক্স।

যেমন, কোনও অ্যাপ যদি XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfos-এ তিনটি স্পেশিয়াল কন্টেনার প্রদান করে:

  • ইন্ডেক্স ০: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO (১ বার দেখা হয়েছে)
  • ইন্ডেক্স ১: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO (২ বার দেখা হয়েছে)
  • ইন্ডেক্স ২: XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO_WITH_FOVEATED_INSET (৪ বার দেখা হয়েছে)

তারপর রানটাইমকে অবশ্যই ৭টি ভিউ সহ views অ্যারে পূরণ করতে হবে:

  • views [0] হল কন্টেনার 0-এর ভিউ।
  • views [1] হল কন্টেনার ১-এর জন্য বাঁদিকের চোখের ভিউ।
  • views [2] হল কন্টেনার ১-এর জন্য ডান চোখের ভিউ।
  • views [3] হল কন্টেনার ২-এর জন্য বাঁদিকের চোখের ভিউ।
  • views [4] হল কন্টেনার ২-এর জন্য ডান চোখের ভিউ।
  • views [5] হল কন্টেনার ২-এর জন্য বাঁদিকের চোখের ইনসেট ভিউ।
  • views [6] হল কন্টেনার ২-এর জন্য ডান চোখের ইনসেট ভিউ।

viewCount যদি প্রতিটি স্পেশিয়াল কন্টেনারের অনুরোধ করা ভিউ কনফিগারেশন টাইপের ভিউ কাউন্টের যোগফলের সমান না হয়, তাহলে রানটাইম অবশ্যই XR_ERROR_VALIDATION_FAILURE রিটার্ন করবে।

রানটাইম অপ্টিমাইজেশনের উদ্দেশ্যে ভিউ কনফিগারেশনকে কম ভিউ সহ একটি প্রকারে ক্ষয় করতে পারে (যেমন, একটি কন্টেনার অনেক দূরে এবং ছোট যাতে স্টেরিও অদৃশ্য থাকে)। রানটাইম যদি ভিউ কনফিগারেশনকে ডিকি করে, তাহলে রানটাইমকে অবশ্যই সেই কন্টেনারের জন্য আসল ভিউয়ের সংখ্যা ফিরিয়ে দিতে হবে, ডিকি করা ভিউয়ের ডুপ্লিকেট দিয়ে অতিরিক্ত ভিউ পূরণ করতে হবে। যেমন, XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO-কে XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO-এ ডিকম্পোজ করা হলে, ইন্ডেক্স ০ এবং ইন্ডেক্স ১, দুটিতেই একটি করে মোনো ভিউ থাকবে। ফলস্বরূপ, views অ্যারেতে দেখানো মোট ভিউয়ের সংখ্যা রানটাইম কোনও ভিউ কনফিগারেশন ডিকে করার সিদ্ধান্ত নিয়েছে কিনা তার উপর নির্ভর করে না।

রানটাইম প্রতিটি XrView :: fov-কে এমনভাবে অ্যাডাপ্ট করতে হবে যাতে ফ্রাস্টাম যতটা সম্ভব ছোট হয় এবং একই সাথে সংশ্লিষ্ট স্পেশিয়াল কন্টেনারের সম্পূর্ণ বাউন্ডারি ধারণ করে। রানটাইম হয়ত অপ্রতিসম FOV ফিরিয়ে দিতে পারে, যেমন কোনও স্পেশিয়াল কন্টেনার যদি ব্যবহারকারীর ভিউয়ের তির্যক কোণে থাকে বা অন্য কোনও অবজেক্টের দ্বারা আংশিকভাবে অবরুদ্ধ থাকে। রানটাইম স্পেশিয়াল কন্টেনারের জন্য টার্গেট রেন্ডারিং সারফেসকে ফ্রিলি পজিশন করতে পারে। মাল্টি-অ্যাপ রেন্ডারিংয়ের প্রকৃতির কারণে, যেখানে স্পেশিয়াল কন্টেনার ব্যবহারকারীর থেকে আলাদা থাকে, রানটাইম XrView ভ্যালু ফিরিয়ে দিতে পারে যা পিক্সেল রেন্ডারিংয়ের জন্য উপযুক্ত নয়, যেমন স্পেশিয়াল কন্টেনার স্ক্রিনে দেখা না গেলে XrView :: fov সেট করার জন্য কোনও সঠিক ভ্যালু থাকে না। এইসব ক্ষেত্রে, রানটাইমকে XrSpatialContainerViewStateEXT :: shouldSubmitLayers-কে false হিসেবে সেট করতেই হবে।

রানটাইম viewStates অ্যারেতে প্রতি-স্পেশিয়াল কন্টেনার রেন্ডারিং স্টেট সংক্রান্ত অতিরিক্ত তথ্য প্রদান করে। viewStateCount যদি XrSpatialContainerViewsLocateInfoEXT :: viewLocateInfoCount-এর সমান না হয়, তাহলে রানটাইমকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতেই হবে।

রানটাইম স্পেশিয়াল কন্টেনারের জন্য XrEventDataSpatialContainerClosedEXT ইভেন্ট কিউতে রাখার পরে, এই ফাংশনটি সংশ্লিষ্ট স্পেশিয়াল কন্টেনারের জন্য XrSpatialContainerViewStateEXT :: shouldSubmitLayers-এ XR_FALSE এবং XrSpatialContainerViewStateEXT :: viewStateFlags-এ 0 রিটার্ন করতেই হবে।

বাস্তব জগতে সক্রিয়ভাবে পরিবর্তনশীল লোকেশন সহ স্পেশিয়াল কন্টেনারের ক্ষেত্রে, রিপ্রোজেকশন আর্টিফ্যাক্ট কমানোর জন্য views পূরণ করার সময় রানটাইমকে কন্টেনারের মোশন বিবেচনা করা উচিত।

বর্তমানে অ্যাক্টিভ রেন্ডার সেটে নেই এমন এক বা একাধিক স্পেশিয়াল কন্টেনারের জন্য xrLocateSpatialContainerViewsEXT কল করা হলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT রিটার্ন করতেই হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

  • xrLocateSpatialContainerViewsEXT কল করার আগে XR_EXT_spatial_container_self_rendering এক্সটেনশন অবশ্যই চালু করতে হবে
  • session অবশ্যই একটি সঠিক XrSession হ্যান্ডেল হতে হবে
  • locateInfo অবশ্যই একটি সঠিক XrSpatialContainerViewsLocateInfoEXT স্ট্রাকচারের পয়েন্টার হতে হবে
  • viewStates অবশ্যই viewStateCount XrSpatialContainerViewStateEXT স্ট্রাকচারের অ্যারের পয়েন্টার হতে হবে
  • views অবশ্যই viewCount XrView স্ট্রাকচারের অ্যারের পয়েন্টার হতে হবে
  • viewStateCount প্যারামিটার অবশ্যই 0-এর থেকে বেশি হতে হবে
  • viewCount প্যারামিটার অবশ্যই 0-এর থেকে বেশি হতে হবে

রিটার্ন কোড

হয়ে গেছে

  • XR_SUCCESS
  • XR_SESSION_LOSS_PENDING

ব্যর্থতা

  • XR_ERROR_FUNCTION_UNSUPPORTED
  • XR_ERROR_HANDLE_INVALID
  • XR_ERROR_INSTANCE_LOST
  • XR_ERROR_RUNTIME_FAILURE
  • XR_ERROR_SESSION_LOST
  • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XR_ERROR_TIME_INVALID
  • XR_ERROR_VALIDATION_FAILURE
  • XR_ERROR_VIEW_CONFIGURATION_TYPE_UNSUPPORTED

XrSpatialContainerViewsLocateInfoEXT স্ট্রাকচারে স্পেশিয়াল কন্টেনারের কালেকশন জুড়ে ভিউ লোকেট করার প্যারামিটার থাকে।

typedef struct XrSpatialContainerViewsLocateInfoEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrTime                                        displayTime;
    uint32_t                                      viewLocateInfoCount;
    const XrSpatialContainerViewLocateInfoEXT*    viewLocateInfos;
} XrSpatialContainerViewsLocateInfoEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • displayTime হল XrTime যেখানে ভিউ লোকেট করতে হবে।
  • viewLocateInfoCount হল viewLocateInfos অ্যারেতে এন্ট্রির সংখ্যা।
  • viewLocateInfos হল XrSpatialContainerViewLocateInfoEXT স্ট্রাকচারের অ্যারের একটি পয়েন্টার।

সঠিক ব্যবহার (অন্তর্নিহিত)

XrSpatialContainerViewLocateInfoEXT স্ট্রাকচারে ভিউ লোকেট করার জন্য স্বতন্ত্র স্পেশিয়াল কন্টেনারের প্যারামিটার থাকে।

typedef struct XrSpatialContainerViewLocateInfoEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
    XrSpace                    space;
    XrSpatialContainerEXT      spatialContainer;
} XrSpatialContainerViewLocateInfoEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • viewConfigurationType হল একটি XrViewConfigurationType যা স্পেশিয়াল কন্টেনারের জন্য ব্যবহার করা হবে।
  • space হল XrSpace যেখানে স্পেশিয়াল কন্টেনারের ভিউগুলি অবস্থিত।
  • spatialContainer হল XrSpatialContainerEXT হ্যান্ডেল।

অ্যাপটি space-এ যেকোনও বৈধ XrSpace প্রদান করতে পারে, তবে এটি সাজেস্ট করা হয় যে এটি XrSpatialContainerViewLocateInfoEXT স্ট্রাকচারের মধ্যে নির্দিষ্ট করা সংশ্লিষ্ট XrSpatialContainerEXT-এর জন্য স্পেশিয়াল কন্টেনার স্পেস প্রদান করে।

সঠিক ব্যবহার (অন্তর্নিহিত)

  • XrSpatialContainerViewLocateInfoEXT ব্যবহার করার আগে XR_EXT_spatial_container_self_rendering এক্সটেনশন অবশ্যই চালু করতে হবে
  • type অবশ্যই XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT হতে হবে
  • next অবশ্যই NULL বা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের সঠিক পয়েন্টার হতে হবে
  • viewConfigurationType অবশ্যই একটি সঠিক XrViewConfigurationType ভ্যালু হতে হবে
  • space অবশ্যই একটি সঠিক XrSpace হ্যান্ডেল হতে হবে
  • spatialContainer অবশ্যই একটি সঠিক XrSpatialContainerEXT হ্যান্ডেল হতে হবে
  • space এবং spatialContainer দুটিই একই XrSession থেকে তৈরি, বরাদ্দ বা ফিরিয়ে আনা হতেই হবে

XrSpatialContainerViewStateEXT স্ট্রাকচারটি xrLocateSpatialContainerViewsEXT-এ কল করার মাধ্যমে পপুলেট করা হয়, যেখানে প্রতিটি স্পেশিয়াল কন্টেনার রেন্ডারিংয়ের উপযুক্ততা সংক্রান্ত তথ্য থাকে।

typedef struct XrSpatialContainerViewStateEXT {
    XrStructureType            type;
    void*                      next;
    XrViewStateFlags           viewStateFlags;
    XrViewConfigurationType    viewConfigurationType;
    XrBool32                   shouldSubmitLayers;
    XrExtent2Di                recommendedImageExtent;
} XrSpatialContainerViewStateEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • viewStateFlags হল XrViewStateFlags-এর বিটমাস্ক। এইসব ফ্ল্যাগের উদ্দেশ্য মূল XrViewState স্ট্রাকচারে viewStateFlags-এর মতোই।
  • viewConfigurationType হল একটি XrViewConfigurationType যা রানটাইম স্পেশিয়াল কন্টেনারের জন্য যে ভিউ কনফিগারেশন টাইপ ব্যবহার করছে তা নির্দেশ করে, যে রানটাইম অনুরোধ করা ভিউয়ের চেয়ে কম সংখ্যক ভিউ সহ একটি ভিউ কনফিগারেশনে ক্ষয় হতে পারে।
  • shouldSubmitLayers হল রানটাইম দ্বারা ফেরত দেওয়া একটি XrBool32। XR_FALSE হলে, অ্যাপের উচিত এই স্পেশিয়াল কন্টেনারের জন্য কম্পোজিশন জমা দেওয়া এড়িয়ে যাওয়া, কারণ এটি বর্তমানে দেখা যাচ্ছে না বা এমন অবস্থায় আছে যেখানে রেন্ডার করার প্রয়োজন নেই।
  • recommendedImageExtent হল একটি XrExtent2Di স্ট্রাকচার যা স্পেশিয়াল কন্টেনারের জন্য সাজেস্ট করা রেজোলিউশনকে উপস্থাপন করে।

কোর OpenXR ভিউ লোকেশনের মতো, রেন্ডারিংয়ের জন্য ভিউ ডেটা ব্যবহার করার আগে, পজিশন ও ওরিয়েন্টেশন সঠিক কিনা এবং ট্র্যাক করা হয়েছে কিনা তা নিশ্চিত করতে, অ্যাপকে XrSpatialContainerViewStateEXT :: viewStateFlags অবশ্যই চেক করতে হবে।

রানটাইম যা সাজেস্ট করে তার থেকে বেশি রেন্ডার করা এড়াতে, অ্যাপের shouldSubmitLayers ও viewConfigurationType চেক করা উচিত। shouldSubmitLayers মিথ্যা হলে, অ্যাপটি তার রেন্ডারিং আচরণ নিম্নলিখিতভাবে পরিবর্তন করে:

  • অ্যাপটি সংশ্লিষ্ট XrView :: fov অবশ্যই রিড করবে না।
  • অ্যাপটি recommendedImageExtent অবশ্যই পড়বে না।
  • অ্যাপের উচিত সোয়াপচেনে রেন্ডার করা এবং সংশ্লিষ্ট স্পেশিয়াল কন্টেনারের জন্য কম্পোজিশন লেয়ার জমা দেওয়া এড়িয়ে চলা।
  • অ্যাপকে XrSpatialContainerLayerEXT :: retainPreviousSubmission সঠিক হিসেবে সেট করতে হবে। অ্যাপটি যদি যেকোনও উপায়ে লেয়ার জমা দেওয়ার সিদ্ধান্ত নেয়, তাহলে লেয়ারগুলির সাথে কী করতে হবে তা রানটাইম নির্ধারণ করবে (যেমন, রানটাইম সেগুলি বাদ দেওয়ার সিদ্ধান্ত নিতে পারে)।

recommendedImageExtent বিশেষভাবে সেইসব লেয়ারের জন্য যা কন্টেনারের পজিশন বা ব্যবহারকারীর ভিউয়ের উপর ভিত্তি করে আপডেট করা হবে। স্পেশিয়াল কন্টেনারের পজিশন বা ব্যবহারকারীর ভিউয়ের (যেমন, সাধারণ 3D কন্টেন্ট) উপর নির্ভর করে এমন কন্টেন্ট সহ লেয়ার আপডেট করার সময়, অ্যাপকে ডিফল্ট সাজেস্ট করা ভিউ সাইজের পরিবর্তে এই ছোট ভিউপোর্টে রেন্ডার করতে হবে। স্পেশিয়াল কন্টেনারের পজিশন বা ব্যবহারকারীর ভিউয়ের উপর নির্ভর করে না এমন কন্টেন্ট সহ লেয়ার আপডেট করার সময় (যেমন, স্ট্যাটিক কোয়াড লেয়ার), অ্যাপ নিরাপদে এইসব ভ্যালু উপেক্ষা করতে পারে। ভিউ ডিপেন্ডেন্ট লেয়ারের জন্য, recommendedImageExtent হল রানটাইম থেকে অ্যাপের জন্য একটি সাজেশন যার উদ্দেশ্য হল এলিয়াসিং কমানো এবং রেন্ডারিং পারফর্ম্যান্স উন্নত করা। অ্যাপ চাইলে সম্পূর্ণ রেজোলিউশনে জমা দিতে পারে।

recommendedImageExtent -এর XrExtent2Di :: width এবং XrExtent2Di :: height XrViewConfigurationView :: recommendedImageRectWidth এবং XrViewConfigurationView :: recommendedImageRectHeight-এর থেকে কম বা সমান একটি পজিটিভ পূর্ণসংখ্যা XrViewConfigurationView-এর জন্য স্পেশিয়াল কন্টেনারের প্রাথমিক ভিউ কনফিগারেশন হতেই হবে। কোনও অ্যাপের শুধুমাত্র recommendedImageExtent পরিবর্তন হওয়ার কারণে সোয়াপচেন আবার তৈরি করা উচিত নয়, কারণ এটি অ্যাপের জন্য একটি ডায়নামিক ইঙ্গিত যা জমা দেওয়া যেকোনও ফুল রেজোলিউশন কম্পোজিশন লেয়ারের XrSwapchainSubImage-এ ব্যবহার করার জন্য XrSwapchainSubImage :: imageRect নির্দিষ্ট করে এবং প্রতিটি ফ্রেম পরিবর্তন করতে পারে।

সঠিক ব্যবহার (অন্তর্নিহিত)

রেফারেন্স স্পেস দেখুন

ভিউ রেফারেন্স স্পেস অপরিবর্তিত থাকে কারণ এটি OpenXR কোরে রয়েছে। কোরের মতো, এটি রেন্ডারিংয়ের জন্য ব্যবহার করা হয় না।

xrEndFrame-এর মাধ্যমে লেয়ার জমা দেওয়া হচ্ছে

স্পেশিয়াল কন্টেনার রেন্ডার করার জন্য, অ্যাপকে xrEndFrame-এ তাদের সংশ্লিষ্ট স্পেশিয়াল কন্টেনারের সাথে যুক্ত লেয়ারের তালিকা অবশ্যই প্রদান করতে হবে। এটি XrSpatialContainerLayerFrameEndInfoEXT স্ট্রাকচারের মাধ্যমে করা হয়।

typedef struct XrSpatialContainerLayerFrameEndInfoEXT {
    XrStructureType                      type;
    const void*                          next;
    uint32_t                             containerLayerCount;
    const XrSpatialContainerLayerEXT*    containerLayers;
} XrSpatialContainerLayerFrameEndInfoEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • containerLayerCount হল containerLayers অ্যারেতে থাকা এলিমেন্টের সংখ্যা।
  • containerLayers হল XrSpatialContainerLayerEXT স্ট্রাকচারের অ্যারের একটি পয়েন্টার।

containerLayers অ্যারেতে অ্যাক্টিভ রেন্ডার সেটের প্রতিটি স্পেশিয়াল কন্টেনারের জন্য একটি XrSpatialContainerLayerEXT থাকে (xrBeginSpatialContainerRenderingEXT এবং xrEndSpatialContainerRenderingEXT দ্বারা সেশন প্রতি ম্যানেজ করা কন্টেনার)। প্রতিটি XrSpatialContainerLayerEXT-এ প্রদত্ত স্পেশিয়াল কন্টেনারের সাথে যুক্ত XrCompositionLayerBaseHeader পয়েন্টারের একটি তালিকা থাকে। রানটাইম হয়ত containerLayers-এর ক্রম নির্বিশেষে, তাদের বেছে নেওয়া যেকোনও ক্রমে কম্পোজিট কন্টেনার। যেমন, রানটাইম ব্যবহারকারীর সাপেক্ষে গভীরতার উপর ভিত্তি করে কন্টেনার কম্পোজিট করতে পারে, ব্যাকগ্রাউন্ড লেয়ার হিসেবে স্পেশিয়াল কন্টেনার অ্যাক্ট থাকতে পারে অথবা স্পেশিয়াল কন্টেনার 'পিন' করতে পারে যাতে গভীরতা যাই হোক না কেন এটি সবসময় উপরে থাকে। রানটাইম বাউন্ডেড বা ইমারসিভ মোডে স্পেশিয়াল কন্টেনারের জন্য বিভিন্ন স্ট্র্যাটেজি ব্যবহার করে কম্পোজিট লেয়ার তৈরি করতে পারে। যেমন, রানটাইম প্রতিটি বাউন্ডেড স্পেশিয়াল কন্টেনারের কম্পোজিশন লেয়ারকে একটি সিঙ্গেল স্টেরিও কোয়াড লেয়ারে প্রি-কম্পোজিট করতে পারে যা দ্বিতীয় কম্পোজিশন ধাপে অন্যান্য সব কন্টেনারের সাথে কম্বাইন করা হয়।

XrFrameEndInfo :: displayTime এবং XrFrameEndInfo :: environmentBlendMode XrSpatialContainerLayerFrameEndInfoEXT-এ সরবরাহ করা সমস্ত স্পেশিয়াল কন্টেনারে প্রয়োগ করা হবে।

এই স্ট্রাকচার XrFrameEndInfo-এর সাথে চেইন হয়ে xrEndFrame-এ পাস করা হলে, অ্যাক্টিভ রেন্ডার সেটের উপর ভিত্তি করে নিম্নলিখিত অতিরিক্ত সমস্যার কেস যোগ করা হয়:

  • containerLayers-এর একাধিক এলিমেন্ট দ্বারা কোনও স্পেশিয়াল কন্টেনার রেফার করা হলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT ফিরিয়ে দিতেই হবে।
  • অ্যাক্টিভ রেন্ডার সেটে কোনও স্পেশিয়াল কন্টেনার containerLayers-এর কোনও এলিমেন্ট দ্বারা রেফারেন্স করা না হলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT রিটার্ন করতেই হবে।
  • containerLayers দ্বারা রেফারেন্স করা স্পেশিয়াল কন্টেনার যদি অ্যাক্টিভ রেন্ডার সেটের মেম্বার না হয়, তাহলে রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT রিটার্ন করতেই হবে।

এছাড়াও, অ্যাক্টিভ রেন্ডার সেটে কোনও স্পেশিয়াল কন্টেনার থাকলে এবং এই স্ট্রাকচার XrFrameEndInfo-এর সাথে চেন করা না থাকলে, রানটাইমকে XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT রিটার্ন করতেই হবে।

উপরে উল্লেখ করা কোনও সমস্যার ক্ষেত্রে, রানটাইমকে কোনও স্পেশিয়াল কন্টেনারের জন্য কোনও কন্টেন্ট রেন্ডার করলে চলবে না।

অ্যাক্টিভ রেন্ডার সেটে কোনও স্পেশিয়াল কন্টেনার না থাকলে, কোনও অ্যাপ যতক্ষণ পর্যন্ত কোনও কম্পোজিশন লেয়ার জমা দিচ্ছে না, ততক্ষণ পর্যন্ত xrEndFrame কল করতে পারে।

মনে রাখবেন, সঠিক স্ট্রাকচারে লেয়ারের মাধ্যমে একাধিক কন্টেনারের জন্য আলাদা আলাদা সোয়াপচেন জমা দেওয়া যেতে পারে, যেমন, একাধিক স্পেশিয়াল কন্টেনারে জমা দেওয়া একটি সোয়াপচেনের মাধ্যমে রেন্ডার করা কোয়াড লেয়ার। এই কেসটি অন্যান্য রেন্ডারিংয়ের সাথে একইভাবে ম্যানেজ করা হয়: রানটাইমকে এই ধরনের সব স্পেশাল কন্টেনারে কোয়াড রেন্ডার করতেই হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

XrSpatialContainerLayerEXT স্ট্রাকচার স্ট্যান্ডার্ড কম্পোজিশন লেয়ারকে গ্রুপ করে এবং নির্দিষ্ট স্পেশিয়াল কন্টেনারের সাথে সেগুলিকে যুক্ত করে।

typedef struct XrSpatialContainerLayerEXT {
    XrStructureType                               type;
    const void*                                   next;
    XrSpatialContainerEXT                         spatialContainer;
    XrBool32                                      retainPreviousSubmission;
    uint32_t                                      layerCount;
    const XrCompositionLayerBaseHeader* const*    layers;
} XrSpatialContainerLayerEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • spatialContainer হল XrSpatialContainerEXT যা টার্গেট কন্টেনার শনাক্ত করে।
  • retainPreviousSubmission হল XrBool32। XR_TRUE হলে, রানটাইম এই স্পেশিয়াল কন্টেনারের জন্য শেষ জমা দেওয়া ফ্রেমটি রেখে দেবে।
  • layers অ্যারেতে কম্পোজিশন লেয়ারের সংখ্যা হল layerCount।
  • layers হল XrCompositionLayerBaseHeader পয়েন্টারের অ্যারের একটি পয়েন্টার।

retainPreviousSubmission যখন XR_TRUE হয়, তখন রানটাইমকে অবশ্যই কম্পোজিশন লেয়ার এবং সোয়াপচেন ইমেজ কন্টেন্ট আবার ব্যবহার করতে হবে, যেমনটি সবচেয়ে সাম্প্রতিক xrEndFrame কলের সময় ল্যাচ করা হয়েছিল, যেখানে retainPreviousSubmission ছিল XR_FALSE । রিটেন করা লেয়ারের মাধ্যমে ব্যবহৃত সোয়াপচেনে পরবর্তী কোনও পরিবর্তন করা হলে তা রেন্ডার করা আউটপুটে অবশ্যই দেখা যাবে না।

কোনও স্বতন্ত্র স্পেশিয়াল কন্টেনারের (ইন্ট্রা-কন্টেনার রেন্ডারিং) জন্য জমা দেওয়া লেয়ারের ক্ষেত্রে, রানটাইমকে লেয়ার কম্পোজিশন অর্ডারিংয়ের জন্য আগে থেকে নির্দিষ্ট করা নিয়ম অবশ্যই মেনে চলতে হবে। অর্থাৎ, কন্টেনারের মধ্যে থাকা লেয়ারগুলি অবশ্যই নির্দিষ্ট করা ক্রম অনুযায়ী আঁকতে হবে, যা পেইন্টারের অ্যালগরিদমের মাধ্যমে কম্পোজ করা হয়।

স্পেশিয়াল কন্টেনার "মুছে দেওয়া" বলতে স্পেশিয়াল কন্টেনার থেকে সব কন্টেন্ট সরিয়ে দেওয়াকে বোঝায়, যার ফলে বর্তমান ফ্রেমে সেই কন্টেনারের জন্য কিছুই রেন্ডার করা হয় না। রানটাইমকে অবশ্যই এটিকে কন্টেনারের মধ্যে প্রতিটি পিক্সেলের জন্য স্বচ্ছ কালো (সব বিট ০) জমা দেওয়া অ্যাপের সমতুল্য হিসেবে বিবেচনা করতে হবে। স্পেশিয়াল কন্টেনার "রিটেন" করার অর্থ হল, রানটাইম সেই কন্টেনারের জন্য সবচেয়ে সাম্প্রতিক জমা দেওয়া লেয়ারের সেট দেখানো চালিয়ে যাবে।

প্রতিটি স্পেশিয়াল কন্টেনারের জন্য অ্যাপ নির্দিষ্ট করতে পারে যে নতুন লেয়ার জমা দিতে হবে, আগের জমা দেওয়া কন্টেন্ট রেখে দিতে হবে নাকি স্পেশিয়াল কন্টেনার মুছে দিতে হবে:

  • নতুন লেয়ার জমা দিতে, অ্যাপটি একটি নন-জিরো layerCount এবং একটি সঠিক layers পয়েন্টার প্রদান করে।
  • স্পেশিয়াল কন্টেনার খালি করতে, এর এন্ট্রির জন্য layerCount অবশ্যই ০ এবং retainPreviousSubmission অবশ্যই XR_FALSE হতে হবে।
  • শেষবার জমা দেওয়া লেয়ার ও সোয়াপচেন ছবি (রিটেনিং) রেখে দিতে, এর এন্ট্রির জন্য layerCount অবশ্যই 0 এবং retainPreviousSubmission অবশ্যই XR_TRUE হতে হবে।

এই এক্সপ্লিসিট প্রতি-কন্টেনার কন্ট্রোল নিশ্চিত করে যে অ্যাপের উদ্দেশ্য প্রতিটি ফ্রেমে স্পষ্টভাবে জানানো হয়েছে।

retainPreviousSubmission যদি XR_TRUE হয় এবং layerCount যদি ০ না হয়, তাহলে রানটাইম XR_ERROR_VALIDATION_FAILURE রিটার্ন করতেই হবে।

XrSpatialContainerCompositionLayerViewConfigurationEXT যদি কোনও স্পেশিয়াল কন্টেনারের অংশ হিসেবে XrCompositionLayerProjection-এর সাথে চেন করা না থাকে, তাহলে রানটাইমকে XR_ERROR_VALIDATION_FAILURE রিটার্ন করতেই হবে। এই স্ট্রাকচার শুধুমাত্র XrCompositionLayerProjection লেয়ারের ক্ষেত্রে প্রযোজ্য। এটি অন্য লেয়ারের ধরনের (যেমন, কোয়াড বা সিলিন্ডার লেয়ার) সাথে চেন করা থাকলে, রানটাইম অবশ্যই XR_ERROR_VALIDATION_FAILURE রিটার্ন করবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

প্রোজেকশন লেয়ারের জন্য ভিউ কনফিগারেশন নির্দিষ্ট করা

XrSpatialContainerCompositionLayerViewConfigurationEXT স্ট্রাকচারটি স্পেশাল কন্টেনারের জন্য প্রোজেকশন লেয়ার রেন্ডার করতে ব্যবহৃত ভিউ কনফিগারেশন নির্দিষ্ট করতে ব্যবহৃত হয়।

typedef struct XrSpatialContainerCompositionLayerViewConfigurationEXT {
    XrStructureType            type;
    const void*                next;
    XrViewConfigurationType    viewConfigurationType;
} XrSpatialContainerCompositionLayerViewConfigurationEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • viewConfigurationType হল XrViewConfigurationType যা XrCompositionLayerProjection রেন্ডার করতে ব্যবহার করা হয়েছে।

স্পেশিয়াল কন্টেনারের জন্য XrCompositionLayerProjection জমা দেওয়ার সময়, লেয়ার রেন্ডার করার জন্য কোন ভিউ কনফিগারেশন ব্যবহার করা হয়েছে তা অ্যাপকে অবশ্যই উল্লেখ করতে হবে। এটি প্রয়োজনীয় কারণ অ্যাপটি প্রতিটি ফ্রেম স্পেশিয়াল কন্টেনারের প্রাথমিক ভিউ কনফিগারেশন বা রানটাইমের সাজেস্ট করা ডিকেড ভিউ কনফিগারেশন, যদি থাকে, তার সাথে রেন্ডার করা হবে কিনা তা বেছে নিতে পারে।

XrSpatialContainerCompositionLayerViewConfigurationEXT চেইন করা থাকলে, অ্যাপকে অবশ্যই নিশ্চিত করতে হবে যে XrCompositionLayerProjection :: viewCount হল চেইন করা স্ট্রাকচারে নির্দিষ্ট করা XrViewConfigurationType-এর জন্য একটি সঠিক ভিউ কাউন্ট। চেন স্ট্রাকচারে উল্লেখ করা viewConfigurationType অবশ্যই XrSpatialContainerBeginInfoEXT :: primaryViewConfigurationType হতে হবে যা কন্টেনার শুরু করার সময় উল্লেখ করা হয়েছে অথবা রানটাইমের মাধ্যমে XrSpatialContainerViewStateEXT-এ ফিরিয়ে দেওয়া ডিকিড ভিউ কনফিগারেশন টাইপ অথবা এক্সটেনশনের মাধ্যমে চালু করা অতিরিক্ত ভ্যালু হতে হবে।

সঠিক ব্যবহার (অন্তর্নিহিত)

পিক্সেল ক্লিপিং আচরণ

কম্পোজিশন লেয়ার জমা দেওয়ার সময় XrSpatialContainerLayerVolumeClippingEXT চেইন করে, অ্যাপকে রানটাইমকে জানাতে হবে যে তারা স্পেশিয়াল কন্টেনারের সীমার বাইরে পিক্সেল রেন্ডার করে কিনা।

typedef struct XrSpatialContainerLayerVolumeClippingEXT {
    XrStructureType                        type;
    const void*                            next;
    XrSpatialContainerVolumeClippingEXT    volumeClipping;
} XrSpatialContainerLayerVolumeClippingEXT;

মেম্বারের বিবরণ

  • type হল এই স্ট্রাকচারের XrStructureType।
  • next হল NULL অথবা স্ট্রাকচার চেনের পরবর্তী স্ট্রাকচারের পয়েন্টার।
  • volumeClipping হল XrSpatialContainerVolumeClippingEXT যা অ্যাপটি প্রয়োগ করেছে।

অ্যাপটি স্পেশিয়াল কন্টেনারের সীমার বাইরে পিক্সেল রেন্ডার করলে, এই স্ট্রাকচারটি ইঙ্গিত হিসেবে কাজ করে। স্পেশিয়াল কন্টেনার ইমারসিভ মোডে থাকলে, বাউন্ডারি অসীম হওয়ার কারণে এই হিন্টের কোনও অর্থ হয় না।

সেল্ফ রেন্ডারিং ব্যবহার করে বাউন্ডেড স্পেশিয়াল কন্টেনারের জন্য, রানটাইমকে 3D ভলিউম বাউন্ড এবং 2D পিক্সেল বাউন্ড, দুটিরই কারণ জানতে হবে। xrGetSpatialContainerBoundsEXT থেকে 3D ভলিউম বাউন্ড রিটার্ন করা হয়। 2D পিক্সেল বাউন্ড হল সিস্টেমের প্রতিটি ডিসপ্লেতে 3D ভলিউম বাউন্ডের প্রজেকশন।

রানটাইমকে অবশ্যই 2D পিক্সেল বাউন্ডের বাইরে থাকা সোয়াপচেন ইমেজ থেকে পিক্সেল বাদ দিতে হবে, তবে রানটাইমকে অবশ্যই 2D পিক্সেল বাউন্ডের মধ্যে থাকা কিন্তু 3D ভলিউম বাউন্ডের বাইরে থাকা পিক্সেল বাদ দিলে চলবে না। স্টেরিও এফেক্ট যেখানে কন্টেন্ট কন্টেনারের 3D ভলিউম বাউন্ডের বাইরে বা সামনে প্রসারিত হয় তা সম্ভব। অ্যাপ হয়ত বাউন্ডেড স্পেশিয়াল কন্টেনারের 3D ভলিউম বাউন্ডের বাইরের পিক্সেল বাদ দিতে পারে যাতে ডেপথ প্যারাডক্স কমানো যায় এবং কীভাবে তা করা হচ্ছে তার উপর ভিত্তি করে volumeClipping সেট করা উচিত। ডেপথ প্যারাডক্সের কারণে প্রায়ই চোখে চাপ পড়ে এবং ব্যবহারকারীর অস্বস্তি হয়।

রানটাইম হয়ত volumeClipping ব্যবহার করে কোনও নির্দিষ্ট স্পেশিয়াল কন্টেনার কীভাবে দেখানো হবে তা অ্যাডজাস্ট করতে পারে। যেমন, XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT-এ সেট করা হলে, রানটাইম 3D ভলিউম বাউন্ডের পিছনের ফেস রেন্ডার করতে পারে, যার ফলে স্পেশিয়াল কন্টেনার, কন্টেনারের 3D ভলিউম বাউন্ডের পিছনে পিক্সেল আঁকলে, ডেপথ প্যারাডক্স হতে পারে।

ভবিষ্যতের এক্সটেনশন হয়ত গভীরতা সংক্রান্ত তথ্য জমা দেওয়া হলে 3D ভলিউম বাউন্ডের উপর ভিত্তি করে ক্লিপিংয়ের অনুমতি দিতে পারে।

সঠিক ব্যবহার (অন্তর্নিহিত)

নতুন কমান্ড

নতুন স্ট্রাকচার

নতুন Enum কনস্ট্যান্ট

  • XR_EXT_SPATIAL_CONTAINER_SELF_RENDERING_EXTENSION_NAME
  • XR_EXT_spatial_container_self_rendering_SPEC_VERSION
  • XrResult এক্সটেন্ড করা হচ্ছে :

    • XR_ERROR_SPATIAL_CONTAINER_DUPLICATE_EXT
    • XR_ERROR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_IS_RENDERING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_MISSING_EXT
    • XR_ERROR_SPATIAL_CONTAINER_NOT_RENDERING_EXT
  • XrSpatialContainerGraphicsPresentationEXT এক্সটেন্ড করা হচ্ছে :

    • XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
  • XrStructureType এক্সটেন্ড করা হচ্ছে :

    • XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT
    • XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT
    • XR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT

কোড নমুনাগুলি

// Example: Complete lifecycle, view location, and frame submission for spatial containers
PFN_xrBeginSpatialContainerRenderingEXT xrBeginSpatialContainerRenderingEXT; // previously initialized
PFN_xrEndSpatialContainerRenderingEXT xrEndSpatialContainerRenderingEXT; // previously initialized
PFN_xrLocateSpatialContainerViewsEXT xrLocateSpatialContainerViewsEXT; // previously initialized

XrSession session; // previously initialized

// We want to update this container
XrSpatialContainerEXT containerA; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerASpace; // previously initialized

// We want to retain this container
XrSpatialContainerEXT containerB; // previously initialized with XR_SPATIAL_CONTAINER_GRAPHICS_PRESENTATION_SELF_RENDERING_EXT
XrSpace containerBSpace; // previously initialized

// 1. Add to active render set when the app is ready to start submitting layers
XrSpatialContainerBeginInfoEXT beginInfoA {
  .type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
  .spatialContainer = containerA,
  .primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoA));

XrSpatialContainerBeginInfoEXT beginInfoB {
  .type = XR_TYPE_SPATIAL_CONTAINER_BEGIN_INFO_EXT,
  .spatialContainer = containerB,
  .primaryViewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};
CHK_XR(xrBeginSpatialContainerRenderingEXT(session, &beginInfoB));

// ... Frame Loop ...


XrTime displayTime; // returned from xrWaitFrame

const std::vector<XrSpatialContainerEXT> containers = {containerA, containerB};
const std::vector<XrSpace> containerSpaces = {containerASpace, containerBSpace};
uint32_t containerCount = static_cast<uint32_t>(containers.size());

// 2. Setup individual locate info for each container
std::vector<XrSpatialContainerViewLocateInfoEXT> containerLocateInfos(containerCount, {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEW_LOCATE_INFO_EXT,
});

for (uint32_t i = 0; i < containerCount; ++i) {
    containerLocateInfos[i].viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO;
    containerLocateInfos[i].space = containerSpaces[i]; // Recommended to use container's own space
    containerLocateInfos[i].spatialContainer = containers[i];
}

// Setup bulk locate info
XrSpatialContainerViewsLocateInfoEXT locateInfo {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEWS_LOCATE_INFO_EXT,
  .displayTime = displayTime,
  .viewLocateInfoCount = containerCount,
  .viewLocateInfos = containerLocateInfos.data(),
};

// Prepare states to be populated by the runtime
std::vector<XrSpatialContainerViewStateEXT> viewStates(containerCount, {
  .type = XR_TYPE_SPATIAL_CONTAINER_VIEW_STATE_EXT,
});

// Call the dedicated locate views function
// We know the required view count is 2 per container for STEREO
const uint32_t viewsPerConfig = 2;
uint32_t totalViewCount = containerCount * viewsPerConfig;
std::vector<XrView> views(totalViewCount, {.type = XR_TYPE_VIEW});

CHK_XR(xrLocateSpatialContainerViewsEXT(session, &locateInfo, containerCount, viewStates.data(), totalViewCount, views.data()));

// Process results
for (uint32_t i = 0; i < containerCount; ++i) {
    XrBool32 shouldSubmitLayers = viewStates[i].shouldSubmitLayers;
    XrExtent2Di recommendedImageExtent = viewStates[i].recommendedImageExtent;
    XrViewConfigurationType viewConfigurationType = viewStates[i].viewConfigurationType;
    bool isDecayedToMono = (viewConfigurationType == XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO);
    if (shouldSubmitLayers) {
        // App is expected to also verify viewStates[i].viewStateFlags has valid orientation/position bits before rendering
        XrView& leftView = views[i * viewsPerConfig];
        XrView& rightView = views[i * viewsPerConfig + 1];
        // If isDecayedToMono is true, left and right will be identical.
    } else {
        // Skip layer submission but retain previous submission when calling
        // xrEndFrame.
    }
}

// 3. Setup projection layer for container A
XrCompositionLayerProjection projectionLayer = {.type = XR_TYPE_COMPOSITION_LAYER_PROJECTION};
// ... standard projection layer setup (space, viewCount, views, etc.) ...

// Specify which view configuration was used to render this specific layer
XrSpatialContainerCompositionLayerViewConfigurationEXT containerViewConfig {
  .type = XR_TYPE_SPATIAL_CONTAINER_COMPOSITION_LAYER_VIEW_CONFIGURATION_EXT,
  // Even if the runtime decayed to MONO, we indicate what we actually rendered
  .viewConfigurationType = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO,
};

// Chain it to the projection layer
projectionLayer.next = &containerViewConfig;
const XrCompositionLayerBaseHeader* layersA[1] = {reinterpret_cast<const XrCompositionLayerBaseHeader*>(&projectionLayer)};

// Note: In a real app, you are required to submit ALL active containers in the render set.

XrSpatialContainerLayerVolumeClippingEXT containerClippingA = {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
  // Set volumeClipping appropriately for the rendering done.
  .volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};

// Setup container A (Update with new pixels)
XrSpatialContainerLayerEXT containerLayerA {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
  .next = &containerClippingA,
  .spatialContainer = containerA,
  .retainPreviousSubmission = XR_FALSE,
  .layerCount = 1,
  .layers = layersA,
};

XrSpatialContainerLayerVolumeClippingEXT containerClippingB {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_VOLUME_CLIPPING_EXT,
  // Set volumeClipping appropriately for the rendering done.
  .volumeClipping = XR_SPATIAL_CONTAINER_VOLUME_CLIPPING_STRICT_EXT,
};

// Setup container B (Explicitly retain previous frame)
XrSpatialContainerLayerEXT containerLayerB {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_EXT,
  .next = &containerClippingB,
  .spatialContainer = containerB,
  .retainPreviousSubmission = XR_TRUE,
  .layerCount = 0, // Required to be 0 when retaining
  .layers = nullptr,
};

// Aggregate all container layers
XrSpatialContainerLayerEXT containerLayers[] = { containerLayerA, containerLayerB };

XrSpatialContainerLayerFrameEndInfoEXT spatialEndInfo {
  .type = XR_TYPE_SPATIAL_CONTAINER_LAYER_FRAME_END_INFO_EXT,
  .containerLayerCount = 2, // Must equal the number of active containers
  .containerLayers = containerLayers,
};

XrFrameEndInfo frameEndInfo {
  .type = XR_TYPE_FRAME_END_INFO,
  .next = &spatialEndInfo,
  .displayTime = displayTime,
  .environmentBlendMode = XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND,
  .layerCount = 0, // MANDATORY: Must be 0 for self rendering extension
};

CHK_XR(xrEndFrame(session, &frameEndInfo));

// ... End Frame Loop ...

// 4. Remove from active render set when the container is destroyed or no longer needs rendering
XrSpatialContainerEndInfoEXT endInfoA {
  .type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
  .spatialContainer = containerA,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoA));

XrSpatialContainerEndInfoEXT endInfoB {
  .type = XR_TYPE_SPATIAL_CONTAINER_END_INFO_EXT,
  .spatialContainer = containerB,
};
CHK_XR(xrEndSpatialContainerRenderingEXT(session, &endInfoB));

ভার্সনের ইতিহাস

  • সংশোধন ১, ০৬-০৮-২০২৬ (ল্যাচলান ফোর্ড)

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