سؤال

هل من الممكن ضخ أحادية اللون (البيانات الرسومية مع عمق الصورة 1 بت) الملمس إلى برنامج OpenGL؟

وأنا حاليا باستخدام هذا:

glTexImage2D( GL_TEXTURE_2D, 0, 1, game->width, game->height, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, game->culture[game->phase] );

وأنا ضخها مع مجموعة مربع من الأعداد الصحيحة غير موقعة 8 بت في وضع GL_LUMINANCE (تمثل قناة واحدة 8 بت سطوع جميع قنوات 3 و ألفا الكاملة)، ولكنها غير فعالة إلى حد كبير IMO، لأن القيم onlu في مجموعة هي 0x00 وعشرية 0xFF.

هل يمكنني (وكيف) استخدام بسيط بت واحد لكل مجموعة بكسل من القيم المنطقية بدلا من ذلك بطريقة أو بأخرى؟ حجم المفرطة مجموعة يبطئ أي عمليات أخرى على مجموعة: (

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

المحلول

وأصغر غير مضغوط الملمس تنسيق للصور الإنارة يستخدم 8 بت لكل بكسل.

ومع ذلك، يمكن ضغط 1 بت لكل بكسل الصور من دون خسارة إلى تنسيق S3TC أو DXT. هذا سوف لا يكون 1 بت لكل بكسل ولكن في مكان ما بين 2 و 3 بت.

إذا كنت حقا بحاجة 1 بت لكل بكسل يمكنك أن تفعل ذلك مع القليل الحيلة. (يحصل على تحميل الصورة 1 إلى بت 1، 2 صورة في بت 2 وهكذا) حمولة 8 1 بت لكل بكسل القوام واحدة 8 بت ألفا فقط الملمس. مرة واحدة كنت قد فعلت ذلك يمكنك ان "عنوان" كل من القوام الفرعية باستخدام ميزة ألفا اختبار وقليلا من برمجة بيئة الملمس لتحويل ألفا الى اللون.

وهذه إرادة فقط يعمل إذا كان لديك 8 1 بت لكل بكسل القوام وصعبة للحصول على الرغم من الحق.

نصائح أخرى

وبعد بعض البحث، وكنت قادرا على جعل 1-بت لكل بكسل صورة كما الملمس مع التعليمات البرمجية التالية:

static GLubyte smiley[] = /* 16x16 smiley face */
{
    0x03, 0xc0, /*       ****       */
    0x0f, 0xf0, /*     ********     */
    0x1e, 0x78, /*    ****  ****    */
    0x39, 0x9c, /*   ***  **  ***   */
    0x77, 0xee, /*  *** ****** ***  */
    0x6f, 0xf6, /*  ** ******** **  */
    0xff, 0xff, /* **************** */
    0xff, 0xff, /* **************** */
    0xff, 0xff, /* **************** */
    0xff, 0xff, /* **************** */
    0x73, 0xce, /*  ***  ****  ***  */
    0x73, 0xce, /*  ***  ****  ***  */
    0x3f, 0xfc, /*   ************   */
    0x1f, 0xf8, /*    **********    */
    0x0f, 0xf0, /*     ********     */
    0x03, 0xc0  /*       ****       */
};

float index[] = {0.0, 1.0};

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, index);
glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, index);
glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, index);
glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, index);

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,16,16,0,GL_COLOR_INDEX,GL_BITMAP,smiley);

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

وهنا هي النتيجة:

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