سؤال

هل من الممكن تعطيل ألوان الملمس واستخدام اللون الأبيض فقط؟ لا يزال من الممكن قراءة الملمس ، لذلك لا يمكنني استخدام gldisable (gl_texture_2d) لأنني أريد تقديم قنوات ألفا أيضًا.

كل ما يمكنني التفكير فيه الآن هو صنع نسيج جديد حيث تكون جميع بيانات الألوان بيضاء ، وتبقى ألفا كما هي.

ولست بحاجة للقيام بذلك بدون تظليلات, ، فهل هذا ممكن؟

تعديل: للتوضيح: أريد استخدام كلا القوام: الألوان البيضاء والطبيعية.

تحرير: يبدو أن هذا غير ممكن

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

المحلول

ماذا عن تغيير كل لون الملمس (باستثناء ألفا) إلى الأبيض بعد تحميلها وقبل استخدامها في OpenGL؟ إذا كان لديك نقطات في الذاكرة في مرحلة ما ، فيجب أن يكون الأمر سهلاً ولن تحتاج إلى ملفات نسيج منفصلة.

نصائح أخرى

ما زلت لا تماما من المؤكد أنني أفهم بشكل صحيح ما تريده ، لكنني سأعطيه لقطة. ما كنت أفكر فيه هو أنه عندما تتصل glTexImage2D, ، يمكنك تحديد تنسيق Texels الذي تقوم بتحميله و يمكنك تحديد "التنسيق الداخلي" للملمس الذي تقوم بإنشائه من تلك Texels. في حالة نموذجية ، يمكنك تحديد (تقريبًا) نفس التنسيق لكليهما - على سبيل المثال ، ستستخدم عادة GL_RGBA لكليهما.

هناك سبب لتحديد كليهما: format (المعلمة القريبة من نهاية القائمة) تحدد تنسيق Texels الذي تقوم بتحميله من عند, ، لكن ال internal format (واحد قريب من بداية قائمة المعلمات) يحدد تنسيق الملمس الفعلي الذي تنشئه من تلك Texels.

إذا كنت ترغب في تحميل بعض Texels ، ولكن في الواقع فقط استعمال قناة ألفا منها ، يمكنك تحديدها GL_ALPHA ل internal format, ، وهذا كل ما ستحصل عليه - عندما تقوم بتخطيط هذا الملمس إلى السطح ، فإنه سيؤثر فقط على ألفا ، وليس اللون. هذا لا يتجنب فقط إنشاء نسخة إضافية من Texels ، ولكن (على الأقل عادة) يقلل من الذاكرة التي تستهلكها الملمس نفسه أيضًا ، لأنه لا يشمل سوى قناة ألفا ، وليس قنوات الألوان الثلاث.

تحرير: حسنًا ، التفكير في الأمر أكثر قليلاً ، هناك طريقة لفعل ما تريده (على ما أظن) ، باستخدام نسيج واحد فقط. أولاً ، قمت بتعيين وظيفة المزيج لاستخدام قناة ألفا فقط ، ثم عندما تريد نسخ لون الملمس ، يمكنك الاتصال glTextureEnvf مع GL_REPLACE, ، ولكن عندما تريد فقط استخدام قناة ألفا ، فإنك تسميها مع GL_BLEND. على سبيل المثال ، دعنا ننشئ نسيجًا أخضر ، ورسمه (مرتين) على رباعي أزرق ، مرة واحدة مع GL_REPLACE ، وواحد مع GL_BLEND. من أجل البساطة ، سنستخدم نسيج Gree الصلب ، مع زيادة ألفا خطيًا من أعلى (0) إلى أسفل (1):

static GLubyte Image[128][128][4];

for (int i=0; i<128; i++)
    for (int j=0; j<128; j++) {
        Image[i][j][0] = 0;
        Image[i][j][1] = 255;
        Image[i][j][2] = 0;
        Image[i][j][3] = i;
    }

سوف أتخطى معظم إنشاء الملمس وربطه ، وإعداد المعلمات ، وما إلى ذلك ، والوصول مباشرة إلى رسم بضع كواد مع الملمس:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glBegin(GL_QUADS);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
    glColor4f(0.0, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);

glBegin(GL_QUADS);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 0.0); glVertex3f(0.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 0.0); glVertex3f(1.0f, 1.0f, 0.0f);
    glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(1.0, 1.0); glVertex3f(1.0f, -1.0f, 0.0f);
    glColor4f(0.0, 0.0f, 1.0f, 1.0f);
    glTexCoord2f(0.0, 1.0); glVertex3f(0.0f, -1.0f, 0.0f);
glEnd();

هذا ينتج:

Blended Textures

لذلك ، على اليسار حيث يتم رسمه باستخدام gl_replace ، نحصل على اللون الأخضر من الملمس ، ولكن على اليمين ، حيث يتم رسمه باستخدام gl_blend (وتم تعيين glblendfunc لاستخدام قناة ألفا فقط) ألفا مأخوذة من الملمس - لكننا نستخدم نفس الملمس تمامًا لكليهما.

تحرير 2: إذا قررت أنك تحتاج حقًا إلى نسيج أبيض ، فسأقوم فقط بإنشاء نسيج 1 بكسل ، وقم بتعيين gl_texture_wrap_s و gl_texture_wrap_t على gl_repeat. على الرغم من أن هذا لا يزال يستخدم نسيجًا إضافيًا ، إلا أن هذا الملمس الإضافي سيكون هل حقا صغير ، لأنه بكسل واحد فقط. كل من الوقت لتحميله والذاكرة المستهلكة سيكون ضئيلًا حقًا - البيانات الخاصة بالبكسل هي "ضوضاء" بشكل أساسي. لم أحاول الاختبار ، ولكن قد تكون أفضل حالًا بشيء مثل كتلة 8x8 أو 16x16 من وحدات البكسل بدلاً من ذلك. لا يزال هذا صغيرًا جدًا لا يكاد يهم ، ولكن هذه هي الأحجام المستخدمة في JPEG و MPEG على التوالي ، ويمكنني أن أرى أين يمكن تحسين البطاقة و (خاصة) السائق لهم. قد يساعد ذلك ، ولن يؤذي (يكفي للرعاية على أي حال).

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