سؤال

هذا هو نأمل سؤال بسيط:لدي برنامج OpenGL نسيج وأود أن تكون قادرة على تغيير التعتيم, كيف أفعل ذلك ؟ نسيج بالفعل يحتوي على قناة ألفا و مزج يعمل بشكل جيد, ولكن أريد أن تكون قادرة على خفض عتامة كله نسيج, تتلاشى في الخلفية.وأنا مغشوش مع glBlendFunc, ولكن مع عدم وجود الحظ – يبدو أنني بحاجة إلى شيء مثل GL_SRC_ALPHA_MINUS_CONSTANT, التي لا تتوفر.أنا أعمل على اي فون مع برنامج OpenGL ES.

هل كانت مفيدة؟

المحلول 3

وشكرا لكم جميعا للأفكار. لقد لعبت مع كل من glColor4f وglTexEnv وأخيرا أجبر نفسي على قراءة manpage glTexEnv بعناية. يقول manpage أنه في وضع GL_MODULATE التركيب، يتم احتساب اللون الناتج بضرب جزء واردة من خلال اللون التركيب (C = عنصر مشع × ط م)، الشيء نفسه ينطبق على ألفا. حاولت glColor4f (1، 1، 1، والتعتيم) والتي لم تنجح، ولكن تمرير التعتيم المطلوب في كل الحجج أربعة الدعوة لم الحيلة. (لا يزال غير متأكد من السبب بالرغم من ذلك.)

نصائح أخرى

وليس لدي أي فكرة عن برنامج OpenGL ES، ولكن في OpenGL القياسي الذي من شأنه أن مجموعة من الابهام بإعلان لون للنسيج قبل استخدامه:

//          R,   G,   B,   A
glColor4f(1.0, 1.0, 1.0, 0.5);

والمثال شأنه أن يوفر لك 50٪ ألفا دون أن يؤثر على لون النسيج الخاص بك. من خلال تعديل القيم الأخرى التي يمكن أن تحول لون الملمس أيضا.

استخدم عامل آلات النسيج. مهدت الطريق الملمس للقيام بعملية GL_MODULATE بين الملمس ولون ثابت. ثم تغيير لون ثابت من التعليمات البرمجية (glTexEnv، GL_TEXTURE_ENV_COLOR).

وهذا ينبغي أن يأتي على أنها "حرة" من حيث الأداء. في معظم (إن لم يكن كل) الرسومات رقائق تأخذ عمليات الموحد نفس العدد من الدورات GPU (عادة 1)، وذلك فقط باستخدام نسيج مقابل القيام بعملية تعدل (أو أي عملية أخرى) هو بالضبط نفس التكلفة.

وأساسا لديك خياران: استخدام glTexEnv لالملمس مع GL_MODULATE وتحديد لون باستخدام glColor4 * واستخدام مستوى غير مبهمة للقناة ألفا. لاحظ أن glTexEnv ينبغي أن تصدر مرة واحدة فقط، عند أول تحميل الملمس الخاص بك. وهذا السيناريو لا تعمل إذا قمت بتحديد الألوان الخاصة بك في ذروة-سمات بالرغم من ذلك. وتلك هي تجاوز أي glColor4 * اللون الذي قد يحدد. في هذه الحالة، قد ترغب في اللجوء إلى أي من 2 خيارات: استخدام مجمعات الملمس (موضوع المتقدمة، وليس لطيفا، لاستخدامها في خط أنابيب ثابتة)، أو "يدويا" تغيير السمة قمة لون كل قمة الفردية (يمكن أن يكون غير مرغوب فيه ل تنسجم أكبر).

الطريقة الأكثر مباشرة هو تغيير نسيج ألفا قيمة على الطاير.منذ كنت تقول OpenGL عن نسيج في بعض نقطة, سيكون لديك الصورة النقطية في الذاكرة.حتى مجرد ربط نسيج نفس نسيج الهوية.في حال لم يكن لديك في الذاكرة (بسبب ضيق المساحة ، منذ كنت على ES), هل يمكن استرجاع مادة عازلة مرة أخرى باستخدام glGetTexImage().هذا هو الحل نظيفة.

حفظ/استعادة العمليات مكلفة قليلا, على الرغم من ذلك قد ترغب في حل آخر.أفكر في ذلك, كنت قد تكون قادرة على العمل مع الهندسة خلف هندسة عرض الملمس الخاص بك أو ببساطة العمل على المواد/اللون من الهندسة الذي يحمل الملمس.ربما كنت سوف ترغب في الحصول على بعض المضافات مزج الظهر-الهندسة.باستخدام glBlendFunc من

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA),

كنت قد تكون قادرة على "بسهولة" و - الأهم بثمن بخس - تحقيق التأثير المطلوب.

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

وأظن أن لديك خلفية سوداء، وبالتالي من خلال خفض كمية من كل لون، كنت يتلاشى بشكل فعال اللون إلى الأسود.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top