【问题标题】:OpenGL and monochrome textureOpenGL 和单色纹理
【发布时间】:2010-09-24 13:36:22
【问题描述】:

是否可以将单色(具有 1 位图像深度的图形数据)纹理泵入 OpenGL?

我目前正在使用这个:

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

我在 GL_LUMINANCE 模式下使用 8 位无符号整数的方阵(一个 8 位通道代表所有 3 个通道的亮度和完整的 alpha),但它在 IMO 中非常无效,因为数组中的 onlu 值是0x00 和 0xFF。

我可以(以及如何)以某种方式使用简单的每像素一位的布尔数组吗?过大的数组大小会减慢数组上的任何其他操作:(

【问题讨论】:

    标签: c++ opengl textures


    【解决方案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);
    

    结果如下:

    【讨论】:

    • 不错!您是否将其性能与每像素 1 字节的变体进行了比较?
    • 看起来你不能在不改变形状的情况下夹住这个纹理。我只是想摆脱跨境流血。
    • 我发现将内部格式交换为LUMINANCE 会产生相同的视觉效果,但内存只有四分之一。如果有任何更小的格式,我会感兴趣。 Idk 如何获得 S3TC 格式。我不认为 pyOpenGL 有这些扩展。
    • 使用 GL_NEAREST 而不是 GL_LINEAR 会更好看:|
    • @Dmitry 随意修改和添加截图
    【解决方案2】:

    亮度图像的最小未压缩纹理格式使用每像素 8 位。

    但是,可以将每像素 1 位的图像压缩为 S3TC 或 DXT 格式而不会丢失。这仍然不是每像素 1 位,而是介于 2 到 3 位之间。

    如果你真的需要每像素 1 位,你可以用一个小技巧来做到这一点。将 8 个每像素 1 位纹理加载为一个 8 位 Alpha-only 纹理(图像 1 加载到位 1,图像 2 加载到位 2,依此类推)。完成后,您可以使用 alpha 测试功能和一些纹理环境编程来“处理”每个子纹理,以将 alpha 转换为颜色。

    这只有在你有 8 个每像素 1 位的纹理并且很难正确处理时才有效。

    【讨论】:

    • 8 纹理技巧听起来很有趣,但这并不是我真正想要的。我正在使用 OpenGL 来可视化来自我的应用程序的数据,所以这样的技巧会减慢数组上的标准操作(不是说编程复杂性)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多