سؤال

لدي نسيج تم تحميله في الذاكرة بتنسيق RGBA بقيم ألفا مختلفة.

يتم تحميل الصورة على النحو التالي:

 GLuint texture = 0;
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 self.texNum = texture;

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);

أريد أن أعرف كيف يمكنني رسم هذا النسيج بحيث يتم التعامل مع قناة ألفا في الصورة على أنها كل 1 ويتم رسم النسيج مثل صورة RGB.

النظر في الصورة الأساسية:

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

هذه الصورة عبارة عن تقدم من 0 إلى 255 ألفا ولها قيمة RGB تبلغ 255,0,0 طوال الوقت

ومع ذلك، إذا قمت برسمها مع تعطيل المزج، فستحصل على صورة تبدو كما يلي:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

عندما يكون ما أريده حقًا هو صورة تبدو كالتالي:www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

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

يحرر:حاولت استخدام GL_COMBINE لحل مشكلتي على هذا النحو:

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
[self drawTexture];

لكن لم يحالفنا الحظ حتى الآن، فهو لا يزال يسحب اللون الأسود إلى اللون الأحمر.

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

المحلول

لدي نسيج محمل في الذاكرة بتنسيق RGBA مع قيم ألفا المختلفة

gldisable (gl_blend)

ولكن إذا قمت برسمها مع تعطيل المزج، أحصل على صورة تبدو: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

يحدث هذا لأنه في الصورة المصدر الخاصة بك جميع البكسلات الشفافة سوداء.إنها مشكلة في الملمس / الصورة الخاصة بك، أو ربما مع وظيفة تحميل، ولكنها ليست مشكلة OpenGL.

قد تحاول إصلاحه باستخدام gltexenv (gl_combine ...) (أي خلط لون الملمس مع اللون الأساسي يعتمد على قناة ألفا)، ولكن منذ أن فعلت شيئا من هذا القبيل، لست متأكدا تماما،ولا يمكن أن أعطيك المعاملات الدقيقة.كان من الممكن في Direct3D9 (باستخدام D3DTOP_MODULATEALPHA_ADDCOLOR)، لذلك من المرجح أن تكون هناك طريقة للقيام بذلك في OpenGL.

نصائح أخرى

يجب أن تعطيل المزج ولكن استخدم glblelendfunc المعلمات:

giveacodicetagpre.

أو يمكنك إخبار OpenGL بتحميل قنوات RGB الخاصة بصورتك فقط باستخدام

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

قبل الاتصال glTexImage2D مع ضبط التنسيق على GL_RGB.سيؤدي ذلك إلى تخطي البايت الرابع من كل بكسل، أي.قناة ألفا.

كان لدي مشكلة مماثلة، ووجدت أنه لأن تحميل صورة iOS كان يقوم بعمل بطريقة متعمدة على قيم RBG (كما تمت مناقشته في بعض الإجابات والتعليقات الأخرى هنا).أحب أن أعرف ما إذا كانت هناك طريقة لتعطيل الضرب المسبق، ولكن في هذه الأثناء، أنا "Un-multowlying" باستخدام Code المشتق من هذا الموضوع و هذا الموضوع .

giveacodicetagpre.

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