Three.js: BasisTextureLoader: الخطوات التالية

تم إنشاؤها على ٢٢ مايو ٢٠١٩  ·  60تعليقات  ·  مصدر: mrdoob/three.js

تمت إضافة الدعم الأولي لمنسوجات .basis في https://github.com/mrdoob/three.js/pull/16522. تتعقب هذه المشكلة عمليات التنظيف المتبقية والتحسينات المخطط لها. أنا لا أعمل على هذه حتى الآن ، وسوف أقوم بتحديث هذه المشكلة عندما أبدأ ، لذلك نرحب بالعلاقات العامة في هذه الأثناء:

  • [x] نظف TODOs المتبقية في الكود
  • [x] تطبيق إصلاحات eslint
  • [x] أضف الوثائق
  • [x] أضف مثالاً
  • [x] أضف طريقة setMaxWorkers()
  • [x] دعم خرائط الصور
  • [] إصلاح دعم mipmap في iOS
  • [] إعادة ترجمة محول الشفرة الأساسي مع التمهيد الذي اقترحهaustinEng
  • [] إرجاع النسيج بشكل متزامن من load() (بدون ألفا؟)
  • [] دعم ألفا
  • [] دعم تنسيق إخراج تحويل الشفرة شكليًا
  • [x] أضف وحدة ES
Enhancement Loaders

التعليق الأكثر فائدة

يبدو أن هذا الحل البديل (في العامل قبل استدعاء رمز التحويل) يعمل بالنسبة لي. يجب إصلاح هذا في محول الشفرة بالطبع ، ولكن من السهل التحقق من صحة ذلك في JS:

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

ال 60 كومينتر

لم ألق نظرة على الكود بالتفصيل حتى الآن ولكن هل يمكننا إرجاع texture بشكل متزامن من load كما تفعل لوادر النسيج الأخرى؟

أعتقد أنه جيد للاتساق. وإذا لم نعد نسيجًا متزامنًا ، يحتاج المستخدم إلى استدعاء material.needsUpdate = true في رد الاتصال (إذا كانت حلقة الرسوم المتحركة قد بدأت بالفعل).

var material = new XXXMaterial();
textureLoader.load(..., function (texture) {
  material.map = texture;
   // .map is from null to non-null.
   // User needs to call material.needsUpdate = true here if already started animation loop
   // because whether material.map is null or not affects the final shader code.
  material.needsUpdate = true;
});

لم أتحقق حتى الآن من أن هذا يعمل مع THREE.CompressedTexture ، ولكن إذا كان الأمر كذلك ، فأنا أوافق على أن ذلك سيكون أفضل. 👍

تنظيف آخر: الخصائص المعينة للنسيج تعسفي قليلاً (متبقية من العرض التوضيحي الأساسي) ، مثل flipY=false . وهناك متغير startTime غير مستخدم في العامل.

إذا كنت على حق ، لا يبدو أن خرائط الصور الصغيرة مدعومة. لا يدعم Transcoder؟ أو لم تقم أداة التحميل بتنفيذ دعم خرائط الصور فقط حتى الآن؟

يمكن أن يحتوي ملف .basis على عدة مستويات mipmap ، نعم. أعتقد أن محول الشفرة يدعمه بالفعل ، لكنني لم أختبر ذلك. BasisTextureLoader لا يدعمها حتى الآن.

يجب علينا التحديث إلى الإصدار الجديد / الأصغر من محول الشفرة أيضًا: https://github.com/BinomialLLC/basis_universal/pull/7~~ تم.

نعم ، يجب أن يدعمها محول الشفرة. لقد تجاوزت مستوى mip كـ levelIndex إلى transcodeImage .
https://github.com/BinomialLLC/basis_universal/blob/master/webgl/transcoder/basis_wrappers.cpp#L197

شكرا لتفسيراتك.

وإذا كانت هناك أي وظائف أخرى لم يدعمها المُحمل حتى الآن ، ولكن محول الشفرة يدعمها ، فأنت على علم بذلك ، فيرجى إضافتها إلى قائمة TODO. يمكننا المساعدة في التنفيذ.

قدم مثالا. # 16553 قد يكون الأمر بسيطًا جدًا ، فلا تتردد في التحسين / الاستبدال لاحقًا إذا تم دمجه.

في الميزات الأخرى ، يوجد في محول الشفرة ولكن لا يتوفر في المحول THREE.BasisTextureLoader ، يتمثل الاختلاف الرئيسي في أن محول الشفرة يمكنه إخراج العديد من التنسيقات الإضافية:

https://github.com/mrdoob/three.js/blob/dev/examples/js/loaders/BasisTextureLoader.js#L264 -L273

لا أعرف بصراحة متى أستخدم كل هذه الأشياء. أتوقع أن المستخدم سيرغب أحيانًا في التحكم في ذلك ، وفي حالات أخرى ، سيتخذ المحمل (مثل GLTFLoader) القرار بناءً على الغرض من النسيج. على سبيل المثال ، قد يختار تنسيقًا مضغوطًا مختلفًا لـ material.map (اللون الأساسي) عن تنسيق material.aoMap (انسداد محيط).

الطريقة الأكثر وضوحًا لدعم ذلك هي إضافة بديل لـ detectSupport( renderer ) :

// Let loader decide, based on device capabilities:
loader.detectSupport( renderer );

// Or, choose a particular format:
loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );

هذه مشكلة محتملة - إذا كنت أقوم بتحميل مواد متعددة ، فقد لا نرغب في تحويلها جميعًا إلى نفس التنسيق. يمكننا إنشاء برامج تحميل متعددة ، ولكن بعد ذلك يكون من الصعب إعادة استخدام Web Workers الحاليين (وهو أمر مهم). يمكننا تمرير تنسيق إلى طريقة load() ، لكنه لا يتوافق مع الإصدارات السابقة مع TextureLoader. أعتقد أن أفضل شيء قد يكون التأكد من القيام بذلك ...

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC4 );
var fooTex = loader.load( 'foo.basis' );

loader.setFormat( THREE.BasisTextureLoader.BASIS_FORMAT.cTFBC1 );
var barTex = loader.load( 'bar.basis' );

... سيطبق دائمًا التنسيق الصحيح على كل مادة ، على الرغم من أن فك التشفير غير متزامن.

ملاحظة أخرى ، فقط للحفاظ على هذا المسار في مكان ما: غلاف JS في examples/js/libs/basis يحتوي على تغيير طفيف من الإصدار الموجود في مستودع Basis. يتم استبدال الإعلان الأول ( var Module ) بـ Module لتمكين التهيئة البطيئة المستخدمة في Web Worker. من المحتمل أن يتم ذلك بشكل مختلف ، إما عن طريق تجميع محول الشفرة بأعلام مختلفة أو عبر https://github.com/BinomialLLC/basis_universal/issues/21.

هل يجب أن يعمل BasisTextureLoader جنبًا إلى جنب مع glTF؟ لقد حاولت ترميز القوام يدويًا إلى تنسيق .basis وإضافة BasisTextureLoader كمحمل مثل هذا:

var basisLoader = new THREE.BasisTextureLoader();
basisLoader.setTranscoderPath( 'basis/' );
basisLoader.detectSupport( renderer );

THREE.Loader.Handlers.add( /\.basis$/i, basisLoader );

لكن لا يتم تقديم الأنسجة بشكل صحيح ، وتحتوي وحدة التحكم على الإخراج التالي:

[.WebGL-000002B68031CEF0]RENDER WARNING: texture bound to texture unit 1 is not renderable. It maybe non-power-of-2 and have incompatible texture filtering.

نفس المشكلة التي وصفها zeux

لقد قمت بتصحيح هذا وهذا يحدث للأسباب التالية:

  1. عادةً ما تعيّن أداة تحميل glTF تصفية mag إلى LinearMipMapLinearFilter
  2. لا يدعم BasisTextureLoader خرائط الصور الصغيرة
  3. يتطلب webGL إكمال سلاسل mip: - /

zeux غير مدعوم رسميًا - تسمح مواصفات glTF الأساسية فقط بتركيبات JPEG و PNG. لكن امتداد Basis (عبر غلاف KTX2) هو الآلية التي نخطط من خلالها لإضافة دعم نسيج مضغوط إلى التنسيق. راجع https://github.com/KhronosGroup/glTF/pull/1612 للحصول على امتدادات المسودة (فقط الأولين مرتبطان هنا) ولا تتردد في إضافة ملاحظات.

ومع ذلك ، فإن عدم وجود دعم mipmap في BasisTextureLoader هو محض لأننا لم نصل إليه بعد. يجب أن يدعم محول الشفرة نفسه ذلك بقدر ما أعرف.

تم إرسال العلاقات العامة لإصلاح دعم mipmap - مع هذا طالما قمت بتحويل الزخارف باستخدام خيار -mipmap ، فإن محمل glTF يعمل فقط طالما قمت بإضافة المحمل كما هو مذكور أعلاه ، على الأقل على سطح المكتب. لم أتمكن من تشغيله على الهاتف المحمول (iPhone أو Android) ، لكن مثال threejs.org مع المكعب الدوار لا يعمل على iPhone أيضًا ، لذا قد تكون هذه مشكلة منفصلة.

لم أتمكن من تشغيله على الهاتف المحمول (iPhone أو Android)

من مستندات Basis -

على سبيل المثال ، في نظام التشغيل iOS ، يمكنك فقط استخدام قوة مربعة ذات أبعاد نسيجية لـ PVRTC1 ، ولا يوجد شيء يمكن لـ Basis فعله لك اليوم والذي يعمل على حل هذا القيد. (سندعم القدرة على تحويل القوام الأصغر غير pow2 إلى قوة أكبر من 2 من مواد PVRTC1 قريبًا.)

لقد استخدمنا نسيجًا بحجم 512 × 768 في هذا العرض التوضيحي ، ومن المحتمل أن نستبدله بشيء يناسب هذا القيد.

حسنًا - هذا منطقي. FWIW يحتوي هاتف Android الذي كنت أختبره على مجموعة كاملة من المشكلات مع العديد من عروض WebGL التوضيحية ، وليس فقط البنية الأساسية ذات الصلة - يعمل هاتف Android مختلف على ما يرام. لذا ، ربما يكون مجرد تقييد قوة اثنين هو الذي يمثل مشكلة على نظام التشغيل iOS.

تتوفر تحديثات مختلفة لـ BasisTextureLoader في https://github.com/mrdoob/three.js/pull/16675.

ربما يجب أن نفكر أيضًا في كيفية دعم ألفا ... تدخل وثائق الأساس في بعض التفاصيل حول الخيارات (https://github.com/BinomialLLC/basis_universal/#how-to-use-the-system) ولكن بالنسبة للبعض الأجهزة التي تتضمن نواتج تحويل متعددة:

أجهزة ETC1 فقط / واجهات برمجة التطبيقات (API): قم بتحويل الشفرة إلى نسيجين من ETC1 وأخذ عينات منها في تظليل. يمكنك إما استخدام نسيج ETC1 واحد يبلغ ضعف ارتفاعه ، أو نسيجين منفصلين من نسيج ETC1.

حتى الآن تطابق واجهة برمجة التطبيقات TextureLoader ، والتي ستحتاج إلى التغيير (أو أن يكون لها واجهة برمجة تطبيقات بديلة) لدعم إعادة مخرجات متعددة محولة من مادة .basis .

يؤدي التغيير إلى نسيج مربع مكون من اثنين في https://github.com/mrdoob/three.js/pull/16686 إلى إصلاح العرض التوضيحي على نظام التشغيل iOS ، لكن خرائط الصور الصغيرة لا تعمل:

INVALID_VALUE: CompedTexImage2D: طول ArrayBufferView غير صحيح للأبعاد.

هل نحتاج إلى القيام بأي شيء خاص للخرائط الصورية باستخدام PVRTC؟

هل هذا يحدث لواحدة من الأفلام القليلة الماضية؟

لم أقم بتصحيح الأخطاء بشكل كافٍ لتحديد أي mips ، لكن الخطأ تمت طباعته ثلاث مرات ، وكانت الثلاثة الأخيرة لها نفس حجم المخزن المؤقت. 🤔

أظن أن Basis لا يحسب الحجم (بالبايت) لآخر عدد من المقاطع بشكل صحيح. بالنسبة لـ PVRTC1 4bpp ، يتم تقريب أبعاد الكتل إلى 8 ، لذلك يجب أن تكون 4 × 4 و 2 × 2 و 1 × 1 بنفس حجم 8 × 8. أعتقد أن محول الشفرة Basis يقترب من 4x4. يجب أن تستغرق جميع الصور ذات الأحجام 8 × 8 و 4 × 4 و 2 × 2 و 1 × 1 32 بايت ؛ أعتقد أنه بالنسبة لـ 4x4 ​​وأدناه ، يفترض Basis أنها كتلة 1 4x4 فقط 8 بايت وتعطيك 8 بايت بدلاً من 32. @ richgel999

صيغة حساب أحجام الصور هنا: https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt :

   For PVRTC 4BPP formats the imageSize is calculated as:
     ( max(width, 8) * max(height, 8) * 4 + 7) / 8

يبدو أن هذا الحل البديل (في العامل قبل استدعاء رمز التحويل) يعمل بالنسبة لي. يجب إصلاح هذا في محول الشفرة بالطبع ، ولكن من السهل التحقق من صحة ذلك في JS:

var mipWidth = basisFile.getImageWidth( 0, mip );
var mipHeight = basisFile.getImageHeight( 0, mip );
var mipSize = basisFile.getImageTranscodedSizeInBytes( 0, mip, config.format );

if ( config.pvrtcSupported ) {

    // Basis incorrectly computes mip sizes for PVRTC, let's fix them up using the spec:
    // https://www.khronos.org/registry/OpenGL/extensions/IMG/IMG_texture_compression_pvrtc.txt
    mipSize = Math.floor((Math.max(mipWidth, 8) * Math.max(mipHeight, 8) * 4 + 7) / 8);

}

var dst = new Uint8Array( mipSize );

شكرا! سوف أصلح هذا في أسرع وقت ممكن.

يجب إصلاح خطأ حجم خريطة PVRTC1 mipmap. لقد أصلحنا محول الشفرة بحيث يمسح البايتات الزائدة على ميبس صغيرة (أقل من 8 بكسل عرضًا / طويلًا). وقمنا بإصلاح الغلاف لإرجاع الأحجام الصحيحة. يرجى إعلامي إذا كانت هناك أية مشكلات وسأصلحها في أسرع وقت ممكن.

donmccurdy هل يمكنك إضافة "إرجاع texture متزامن من طريقة load " إلى قائمة المهام؟ (كما اقترح takahirox أعلاه)

@ بن ماك وأضاف. لاحظ أنه نظرًا لأن الأنسجة التي تحتوي على قناة ألفا قد تتحول إلى مواد متعددة ، ولن نعرف ذلك بشكل متزامن ، فسنحتاج إلى واجهة برمجة تطبيقات مختلفة لها.

@ richgel999 شكرا لك! أواجه مشكلة في إعادة بناء محول WASM ، حيث تم تحديث https://github.com/BinomialLLC/basis_universal/commit/ab722fa2e18536f9a1d5f33814f3088232446d52 فقط webgl/transcoder/basis_wrappers.cpp . التحويل البرمجي على macOS:

$ emcmake cmake ../
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/donmccurdy/Documents/Projects/basis_universal/webgl/transcoder/build

$ make
[ 33%] Linking CXX executable basis_transcoder.js
Traceback (most recent call last):
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/em++", line 16, in <module>
    emcc.run()
  File "/Users/donmccurdy/Documents/Projects/emsdk/emscripten/1.37.22/emcc.py", line 882, in run
    exec 'shared.Settings.' + key + ' = ' + value in globals(), locals()
  File "<string>", line 1, in <module>
NameError: name 'emmalloc' is not defined
make[2]: *** [basis_transcoder.js] Error 1
make[1]: *** [CMakeFiles/basis_transcoder.js.dir/all] Error 2
make: *** [all] Error 2

من الناحية النظرية ، يجب أن نكون قادرين على تحديث محول الشفرة واستبدال النسيج الحالي PavingStones.basis بهذا ، والذي يتضمن خرائط mip:

PavingStones.basis.zip

تحرير: عفوًا ، قد يكون هذا متعلقًا بـ https://github.com/BinomialLLC/basis_universal/pull/27.

donmccurdy أعتقد أن هذا يتطلب https://github.com/BinomialLLC/basis_universal/pull/27 أن يتم دمجها ، ونأمل أن يحدث هذا قريبًا. كما أن إصدار emscripten الخاص بك قد يسبق وجود emmalloc ، وقد تم إنشاء الملفات التي تعد حاليًا جزءًا من three.js باستخدام 1.38.31 على ما أعتقد.

حدث هذا الخطأ أثناء محاولتي تحميل ملفات أساسية متعددة في نفس الوقت:

Uncaught (in promise) DOMException: Failed to execute 'postMessage' on 'Worker': ArrayBuffer at index 0 is already neutered.

لإعادة الإنتاج ، اتصل فقط بالطريقة load مرتين مثل:

loader.load( 'textures/compressed/PavingStones.basis');
loader.load( 'textures/compressed/PavingStones.basis');

@ Ben-Mack ربما لا يزال الأمر يستحق الإصلاح ، لكن هذا الخطأ يرجع فقط إلى قيامك بتحميل نفس النسيج مرتين ، ويقوم المُحمل بإعادة استخدام ArrayBuffer الذي لا يمكن نقله إلى عاملين في نفس الوقت. يعمل الكود أدناه ، على حساب القيام بضعف العمل:

loader.load( 'textures/compressed/PavingStones.basis?v=1' );
loader.load( 'textures/compressed/PavingStones.basis?v=2' );

donmccurdy للحصول على دعم alpha ماذا عن شيء مثل:

load(...) // as usual
//then :  
loader.getRGBTexture() //return by the load function as usual
loader.getAlphaTexture() //can be use as alphaMap

يمكن أيضًا إضافة خيار لدعم alpha إلى نموذج mipmap:
loader.generateAlpha = true //default

@ Makio64 شيء من هذا القبيل! معظم لوادر threejs ليست ذات حالة (يمكن أن يعمل اللودر الفردي على عدة أشياء بشكل متوازٍ) لذلك ربما:

const [ map ]           = loader.loadRGB( 'foo.basis', { ...options } );
const [ map, alphaMap ] = loader.loadRGBA( 'bar.basis', { ...options } );

^ في كلتا الحالتين ، وخاصة ألفا ، أعتقد أنه قد تكون هناك طرق مختلفة كافية للقيام بأشياء تتطلب بعض التهيئة على الطريقة.

أو يمكننا فقط الانتقال إلى الطرق الجديدة غير المتزامنة ، بدلاً من ذلك:

loader.loadRGBA( 'bar.basis', { ...options }, ( map, alphaMap ) => {
  // ...
} );

يبدو الحل غير المتزامن أكثر سهولة في التنفيذ مع العامل ومواءمته مع لوادر threejs الأخرى.

أنا قادر فقط على تحميل الزخارف بدقة 768 × 512 أو 384 × 256 وما إلى ذلك. يفشل تحميل أي دقة أخرى باستخدام Three.js و BasisTextureLoader مع تحذير:
"النسيج المرتبط بوحدة المظهر السطحي 0 غير قابل للعرض. ربما لا يكون بقوة 2 ويحتوي على ترشيح نسيج غير متوافق."

@ mozg4D يرجى الاطلاع على وثائق Basis ، ولا سيما القوام الذي يتكون من اثنين من المكونات المطلوبة في iOS. إذا لم تتطابق الوثائق مع السلوك الذي تراه ، فيرجى تقديم خطأ جديد. من المحتمل أيضًا أن تكون تصفية النسيج المحددة غير متوافقة ، وفي هذه الحالة سنظل بحاجة إلى عرض توضيحي وسيكون الخطأ الجديد مفيدًا. شكرا!

donmccurdy هل سيتم إصدار دعم ألفا الأساسي قريبًا؟

أعتقد أنني وجدت خطأً: في نظام التشغيل iOS فقط ، هناك تأثير "توهج نسيج" غريب عبر حواف الشكل الهندسي: # 17597

هل واجه أي شخص آخر هذا؟

أعتقد أنه على نظام iOS من المحتمل أن يستخدم PVRTC. هل يحدث هذا في إصدار سابق (r108)؟
ربما يمكنك محاولة تقديم مشكلة في https://github.com/BinomialLLC/basis_universal؟

هل يحدث هذا في إصدار سابق (r108)؟

الخطأ الذي قدمته هو لـ r108.

ربما يمكنك محاولة تقديم مشكلة في https://github.com/BinomialLLC/basis_universal؟

كنت في طور القيام بذلك: https://github.com/BinomialLLC/basis_universal/issues/78

أعتقد أنني وجدت خطأً: في نظام التشغيل iOS فقط ، هناك تأثير "توهج نسيج" غريب عبر حواف الشكل الهندسي: # 17597

أجبته على أساس github. سنلتقط النسيج ونرى ما يحدث. على الأرجح ، إنها قطعة أثرية تتعلق بعدم ضبط الالتفاف / المشبك الذي يعالج علامة تحويل الشفرة بشكل صحيح ، أو قطعة أثرية ناتجة عن مشفر PVRTC1 في الوقت الفعلي. إذا كانت أي من هذه هي المشكلة ، فعادة ما تكون هناك حلول بديلة. يمكننا أيضًا زيادة جودة PVRTC1 ، على حساب المزيد من وقت / ذاكرة وحدة المعالجة المركزية للتحويل.

لقد قمت بنشر تحديث على https://github.com/BinomialLLC/basis_universal/issues/78#issuecomment -536159690 - تم تضمين لقطات الشاشة هناك.

يظهر مشكلة الالتفاف مع مكعب غير دوار.

لقد وجدت خطأ آخر (ولكن على الأرجح غير ذي صلة): https://github.com/mrdoob/three.js/pull/17546#commitcomment -35275564

لقد وجدت خطأ آخر (ولكن على الأرجح غير ذي صلة): # 17546 (تعليق)

ثابت في # 17622.

من حيث خرائط الصور ، هل هناك طريقة لتحميل ملفات نسيج الأساس بشكل صحيح (المشار إليها داخل ملف gltf.) دون الحاجة إلى تضمين خرائط الصور في ملف .basis؟

يمكنني الحصول عليه لتحميل proplery عندما أقوم بإنشاء ملف .basis مع -mipmap ، ولكن هذا يضيف الكثير من حجم الملف إلى ملف .basis - ولكن عندما أقوم بإنشاء ملف .basis بدون -mipmap الخيار ، يظهر ببساطة باللون الأسود في المتصفح باستخدام threejs.

من حيث خرائط الصور ، هل هناك طريقة لتحميل ملفات نسيج الأساس بشكل صحيح (المشار إليها داخل ملف gltf.) دون الحاجة إلى تضمين خرائط الصور في ملف .basis؟

يمكنني الحصول عليه لتحميل proplery عندما أقوم بإنشاء ملف .basis مع -mipmap ، ولكن هذا يضيف الكثير من حجم الملف إلى ملف .basis - ولكن عندما أقوم بإنشاء ملف .basis بدون -mipmap الخيار ، يظهر ببساطة باللون الأسود في المتصفح باستخدام threejs.

في الوقت الحالي ، يمكنك تعطيل خرائط الصور لإظهار النسيج:
https://discourse.threejs.org/t/compressed-texture-workflow-gltf-basis/10039/12؟u=johannesdeml
https://github.com/JohannesDeml/three.js/commit/909d9cc6dc9192f398df7455f52b7e71e3bf61e2

هذا بالطبع لا يدعم الخرائط ، ولكن إذا كان هدفك هو إظهار الزخارف فقط ، فقد يكون هذا حلاً سهلاً بالنسبة لك.

يبدو أن هذا لا يعمل بعد الآن ، ويبدو أن BasisTextureLoader لديه الآن أيضًا رمز مشابه (ضبط min / magFilter = LinearFilter) عند اكتشاف خريطة واحدة فقط (https://github.com/mrdoob/three.js /blob/e66e86901abd84ffc260fea9665170631a2b0493/examples/js/loaders/BasisTextureLoader.js#L170-L171) - وهو ما يولده basisu بدون الخيار -mipmap . ومع ذلك فهو لا يزال أسود.

هل يمكنك مشاركة الملف؟ كنت أفعل هذا مؤخرًا في الأسبوع الماضي ، على الرغم من أنه كان أساسًا في حاوية .ktx2 بدلاً من .basis ...

وللتأكيد فقط - أنت تدرك أنه لا يمكنك إنشاء خرائط mip هذه في وقت التشغيل ، وعليك التعامل مع قيود الاستيفاء المعنية؟

بالتأكيد ، وشكرا لإلقاء نظرة!

body_green.basis.zip

وللتأكيد فقط - أنت تدرك أنه لا يمكنك إنشاء خرائط mip هذه في وقت التشغيل ، وعليك التعامل مع قيود الاستيفاء المعنية؟

نعم ، لقد اكتشفت ذلك أيضًا ، قليلًا من العار نظرًا لأن الكثير من المكاسب التي رأيتها في حجم أقل من. تركز على تنزيل / نقل حجم النسيج.

وللتأكيد فقط - أنت تدرك أنه لا يمكنك إنشاء خرائط mip هذه في وقت التشغيل ، وعليك التعامل مع قيود الاستيفاء المعنية؟

هل هذا هو الحال دائمًا عند استخدام أساس بدلاً من jpg / png؟

ماذا عن حالة استخدام لتعبئة 6 مواد كقائمة مظهر لخريطة مكعبة في ملف أساس واحد حيث أن التنسيق يدعم / يذكر هذا في التمهيدي. هل منشئ PMREM عديم الفائدة هنا ويجب أن يحتوي الملف الأساسي على خرائط خرائط لكل نسيج تم إنشاؤه؟

ماذا عن توفير بيانات النسيج المعبأة لاستخدامها كخريطة مكعب في ThreeJS؟ عادة كنت ستمرر args لكل نسيج على حدة؟ (لم ألق نظرة على دعم محمل النسيج هذا حتى الآن لمعرفة ما إذا كان الملف الأساسي مع مواد متعددة ممكنًا) ربما يكون البديل عبر KTX2 والذي قد يكون أكثر ملاءمة لتوفير ملف أساس معبأ لقائمة الوجه لاستخدامه كخريطة مكعب؟

سؤال أخير حول هذا الاستخدام بينما كنت تناقش التعامل مع ألفا ، يمكن ترميز هذه القوام على أنها RGBE أو RGBM (تدعم ThreeJS M7 و M16). لم أحقق في مدى جودة الضغط مع الأساس ، ولكن يمكن أن يكون لديهم مشكلات مماثلة مثل الخرائط العادية. تعد بيانات قناة ألفا مهمة إلى حد ما لدعمها هناك ، ولست متأكدًا من تنسيق النسيج المضغوط الذي سيتم تحويل ترميزها إليه ، وقد ينتج عن بعضها نتائج سيئة جدًا كما تتناول المقالة المرتبطة أدناه.

كتب ARM مقالًا حول المشكلات المتعلقة بـ ASTC و RGBM على سبيل المثال . محرك الوحدة كما يذكر المقال يستخدم RGBM5 ، والذي يجب أن يغطي في معظم الحالات نطاق HDR مناسبًا ، من المفترض أن ينتج عن المضاعف الأقل مشكلات جودة ضغط أقل من ثابت مضاعف أعلى إذا كانت البيانات تتناسب مع حدود النطاق.

آسف ، لا أعرف إجابة هذه الأسئلة. قد يكون لديك حظ أفضل في مستودعات Basis Universal أو KTX GitHub. أعلم أن KTX2 مصمم لدعم خرائط مكعب مع حمولات Basis.

لقد أثرتها هنا حيث بدت أنها حالات ذات صلة لاستخدام دعم ThreeJS مع مناقشتها هنا.

يمكن لـ Basis تخزين جميع الأنسجة الستة لخريطة مكعب في ملف أساس واحد. يمكن لـ KTX2 مع دعم Basis أن يلبي دعم خرائط التكعيب بشكل أفضل مع مواد متعددة ولكن ملف واحد afaik.

إن قدرة شركة ThreeJS على التعامل معها في المستقبل غير واضحة. ربما يلزم توفير 6 ملفات أساسية مختلفة ، أو الحصول على KTX2 بدعم محمل أساسي.

ستحتاج RGBM5 إلى علاقات عامة منفصلة ، ستكون فقط RGBM7 أو RGBM16 الموجودة حاليًا ، أو متغيرًا يأخذ شكلًا موحدًا لضبط قيمة المضاعف. الجزء الرئيسي المهم هناك هو أن alpha تحتاج إلى التعامل معها بشكل مناسب للضغط بشكل صحيح ، لذا فإن القدرة على التحكم في ذلك كما تمت مناقشته سابقًا في هذه المشكلة هو مثال آخر على المكان الذي سيكون فيه هذا مفيدًا ، على غرار الخرائط العادية و Linear / الخاصة بهم ترميز غير لوني ، والذي قد يحتوي أيضًا على تنسيق مقسم إلى نسيجين محتملين (من لون واحد RGB لـ X و alpha لـ Y في الملف الأساسي) اعتمادًا على دعم الضغط.

يدعم Three.js حاليًا Basis Universal. تم إصدار تنسيق Basis جديد ، UASTC ، قبل بضعة أسابيع فقط. لا أعتقد أن Basis دعمت خرائط التكعيب في ملف واحد قبل ذلك. طلبات السحب ستكون موضع ترحيب.

محمل KTX2 قيد التقدم ، مع https://github.com/mrdoob/three.js/pull/18490.

تُظهر الإصدارات الأقدم من README for Basis (قبل UASTC ، ولكن لا تزال موجودة في README الحالي) ذكرًا لميزة تعبئة النسيج المتعددة في ملف أساس واحد:

تدعم الملفات الأساسية مصفوفات النسيج غير المنتظمة ، لذا يمكن تخزين خرائط التكعيب ، ومواد الحجم ، ومصفوفات النسيج ، ومستويات الخرائط الصغيرة ، وتسلسلات الفيديو ، أو "تجانبات" النسيج العشوائية في ملف واحد. الضاغط قادر على استغلال ارتباطات اللون والنمط عبر الملف بأكمله ، لذلك يمكن تخزين الصور المتعددة ذات الخرائط الصغيرة بكفاءة عالية في ملف واحد.

طلبات السحب ستكون موضع ترحيب.

لا أعرف من أين أبدأ ، وليس لدي وقت فراغ في الوقت الحالي. ربما بمجرد أن تتقدم هذه المشكلة حتى اكتمالها ويكون محمل KTX2 جاهزًا ، يمكن معالجة دعم مخطط مكعب مضغوط / معبأ. إذا كان لدي وقت فراغ بحلول ذلك الوقت ، فسأكون سعيدًا لمحاولة المساهمة في العلاقات العامة :)

مرحبًا بالجميع ، لدي مشكلة متقطعة على iOS (aawww maaaan!)
في الأساس ، يتم تحميل النسيج في بعض الأحيان بشكل جيد ، وأحيانًا لا يظهر.
لا يوجد خطأ في وحدة التحكم ، تقدم التحميل 100٪ ، لذلك بالتأكيد ليست مشكلة في الشبكة.
تم الاختبار على المثال الرسمي (https://threejs.org/examples/؟q=basis#webgl_loader_texture_basis) وفي مشروعي الخاص. على جهاز iPhone X الخاص بي ، على Safari ، يظهر النسيج أحيانًا وأحيانًا لا يظهر.
على iPhone 6 ، Safari ، لا يظهر أبدًا.
كل الآخرين يبدون بخير.
ماذا يمكن أن يكون؟

[EDIT] حصلت للتو على نفس المشكلة في Safari على نظام التشغيل Mac OS ، ولا تزال متقطعة

igghera قد يكون هذا خطأ ، خاصة إذا كان يحدث في المثال الرسمي. هل تمانع في فتح عدد جديد لهذا؟ شكرا!

كيف يمكن للمرء أن يضيف دعمًا لمواد مصفوفة ثنائية الأبعاد في BasisTextureLoader ؟ نظرت إلى هذا قليلاً ولكني لست متأكدًا حقًا من كيفية المضي قدمًا.

يبدو تغيير وظيفة transcode للتكرار فوق الصور من العد الذي تم إرجاعه بواسطة basisFile.getNumImages() أمرًا بسيطًا ، ولكن يبدو أن هناك ثلاثة أشياء يجب معالجتها بعد ذلك:

  1. compressedTexImage3D غير موجود في THREE.WebGLState وسيحتاج إلى تمرير خيار لـ gl.TEXTURE_2D_ARRAY لكل WebGLRenderingContext.compressedTexImage3D
  2. تقوم واجهة برمجة تطبيقات Basis بإرجاع خرائط فردية لكل فهرس صورة ، ولكنك تحتاج إلى كائن نسيج كبير واحد للربط مقابل sampler2DArray ؟
  3. سيحتاج CompressedTexture إلى طريقة لربط خرائط الصور المتحركة لكل فهرس صورة. بالنسبة إلى 200 صورة مصفوفة عميقة و 6 مستويات mipmap ، سيكون هذا 1200 إدخال mipmap ، لذلك من المحتمل أن يصبح mipmaps في CompressedTexture مصفوفة متدرجة. أم أن هناك طريقة يلخص بها WebGL هذه التفاصيل بعيدًا؟

بعد ذلك ، بالنسبة إلى زخارف الفيديو ، ربما تحتاج إلى تطبيق مختلف. بدلاً من تحويل الترميز دفعة واحدة ، ستحتفظ بمقبض الملف الأساسي مفتوحًا ولديك طريقة ما لطلب الإطار التالي.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات