glTexImage2D 上的 Sigabrt

Sigabrt on glTexImage2D

我周末离开时我的代码处于工作状态,自从我回来后,我一直随机收到此错误。有时它 运行s 和我的 android 项目有效,有时却无效。我目前正在研究 NDK 并试图让 Freetype Lib 工作。通过阅读此堆栈跟踪,这里是我的 "relevant" 代码:

void TextRenderer::SetupGlyphs(std::string fontPath, int size){
    if(shadersInitialized == 0)
        CreateShader();
    glUseProgram(this->shader);

    // FreeType
    FT_Library ft;
    if (FT_Init_FreeType(&ft))
        __android_log_print(ANDROID_LOG_INFO, "SetupGlyphs", "ERROR::FREETYPE: Could not init FreeType Library.");

    FT_Face face;
    if (FT_New_Face(ft, fontPath.c_str(), 0, &face))
        __android_log_print(ANDROID_LOG_INFO, "SetupGlyphs", "ERROR::FREETYPE: Failed to load font: %s", fontPath.c_str());

    FT_Set_Pixel_Sizes(face, 0, size);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

    for (GLubyte c = 0; c < 128; c++){
        if(FT_Load_Char(face, c, FT_LOAD_RENDER)){
            printf("ERROR::FREETYPE: Failed to load Glyph\n");
            continue;
        }
        GLuint texture;
        glGenTextures(1, &texture);
        glBindTexture(GL_TEXTURE_2D, texture);
        glTexImage2D(
                GL_TEXTURE_2D,
                0,
                GL_RGB,
                face->glyph->bitmap.width,
                face->glyph->bitmap.rows,
                0,
                GL_RGB,
                GL_UNSIGNED_BYTE,
                face->glyph->bitmap.buffer
        );
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        Character character = {
                texture,
                ivec2(face->glyph->bitmap.width, face->glyph->bitmap.rows),
                ivec2(face->glyph->bitmap_left, face->glyph->bitmap_top),
                static_cast<GLuint>(face->glyph->advance.x)
        };
        characters.insert(std::pair<GLchar, Character>(c, character));
    }
    glBindTexture(GL_TEXTURE_2D, 0);
    FT_Done_Face(face);
    FT_Done_FreeType(ft);
}

这里是堆栈跟踪:

7-05 08:38:23.956 3055-3068/? A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 3068 (GLThread 131)
07-05 08:38:24.059 1193-1193/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
07-05 08:38:24.059 1193-1193/? A/DEBUG: Build fingerprint: 'Android/sdk_google_phone_x86_64/generic_x86_64:6.0/MASTER/2872745:userdebug/test-keys'
07-05 08:38:24.059 1193-1193/? A/DEBUG: Revision: '0'
07-05 08:38:24.059 1193-1193/? A/DEBUG: ABI: 'x86_64'
07-05 08:38:24.059 1193-1193/? A/DEBUG: pid: 3055, tid: 3068, name: GLThread 131  >>> com.example.SanAngeles <<<
07-05 08:38:24.059 1193-1193/? A/DEBUG: signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
07-05 08:38:24.062 1193-1193/? A/DEBUG:     rax 0000000000000000  rbx 00007fd760fbd500  rcx ffffffffffffffff  rdx 0000000000000006
07-05 08:38:24.062 1193-1193/? A/DEBUG:     rsi 0000000000000bfc  rdi 0000000000000bef
07-05 08:38:24.062 1193-1193/? A/DEBUG:     r8  0000000000000012  r9  0000000000000003  r10 0000000000000008  r11 0000000000000202
07-05 08:38:24.063 1193-1193/? A/DEBUG:     r12 0000000000000bfc  r13 0000000000000006  r14 00007fd75d53fb00  r15 000000000000002c
07-05 08:38:24.063 1193-1193/? A/DEBUG:     cs  0000000000000033  ss  000000000000002b
07-05 08:38:24.063 1193-1193/? A/DEBUG:     rip 00007fd769f3f547  rbp 000000000000000e  rsp 00007fd760fbca38  eflags 0000000000000202
07-05 08:38:24.064 1193-1193/? A/DEBUG: backtrace:
07-05 08:38:24.064 1193-1193/? A/DEBUG:     #00 pc 0000000000087547  /system/lib64/libc.so (tgkill+7)
07-05 08:38:24.064 1193-1193/? A/DEBUG:     #01 pc 0000000000085b11  /system/lib64/libc.so (pthread_kill+65)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #02 pc 000000000002e841  /system/lib64/libc.so (raise+17)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #03 pc 00000000000288fd  /system/lib64/libc.so (abort+61)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #04 pc 0000000000002671  /system/lib64/libOpenglSystemCommon.so (QemuPipeStream::writeFully(void const*, unsigned long)+129)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #05 pc 0000000000017c86  /system/lib64/libGLESv2_enc.so
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #06 pc 000000000000e47f  /system/lib64/libGLESv2_enc.so (GL2Encoder::s_glTexImage2D(void*, unsigned int, int, int, int, int, int, unsigned int, unsigned int, void const*)+159)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #07 pc 000000000000c5ee  /system/lib64/egl/libGLESv2_emulation.so (glTexImage2D+94)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #08 pc 00000000000cfb84  /data/app/com.example.SanAngeles-1/lib/x86_64/libsanangeles.so (TextRenderer::SetupGlyphs(std::string, int)+510)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #09 pc 00000000000cfef9  /data/app/com.example.SanAngeles-1/lib/x86_64/libsanangeles.so (TextRenderer::TextRenderer(std::string, std::vector<ProjectLabel, std::allocator<ProjectLabel> >, int)+173)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #10 pc 00000000000cb61a  /data/app/com.example.SanAngeles-1/lib/x86_64/libsanangeles.so (appInit+1144)
07-05 08:38:24.065 1193-1193/? A/DEBUG:     #11 pc 00000000000ceb49  /data/app/com.example.SanAngeles-1/lib/x86_64/libsanangeles.so (Java_com_example_SanAngeles_DemoRenderer_nativeInit+78)
07-05 08:38:24.066 1193-1193/? A/DEBUG:     #12 pc 000000000030e080  /data/app/com.example.SanAngeles-1/oat/x86_64/base.odex (offset 0x1d0000) (void com.example.SanAngeles.DemoRenderer.nativeInit(java.lang.String)+180)
07-05 08:38:24.066 1193-1193/? A/DEBUG:     #13 pc 000000000030e5f3  /data/app/com.example.SanAngeles-1/oat/x86_64/base.odex (offset 0x1d0000) (void com.example.SanAngeles.DemoRenderer.onSurfaceCreated(javax.microedition.khronos.opengles.GL10, javax.microedition.khronos.egl.EGLConfig)+423)
07-05 08:38:24.066 1193-1193/? A/DEBUG:     #14 pc 0000000073ee31f8  /data/dalvik-cache/x86_64/system@framework@boot.oat (offset 0x1ed6000)
07-05 08:38:24.127 1193-1193/? A/DEBUG: Tombstone written to: /data/tombstones/tombstone_05
07-05 08:38:24.127 1193-1193/? E/DEBUG: AM write failed: Broken pipe## Heading ##

为什么它只是偶尔失败?

编辑:通过日志记录我发现它在 ascii 代码 35 的字符处失败。

Edit2:我不知道为什么,但它会随机卡在不同的角色上。有时,甚至,它根本不会卡住,只会编译 运行...我什至不知道了。

因此,对于可能发现此 post 的任何人,我在网上搜索了几个小时,终于找到了答案。 Freetype 没有通过 GL_RGB 对齐(至少在我的项目中没有),而是通过 GL_LUMINANCE 对齐。通过更改 glTexImage2D 中的此类内容,我解决了上述问题,以及我遇到的一些奇怪的图形错误。

TLDR;

glTexImage2D(
            GL_TEXTURE_2D,
            0,
            GL_RGB,                        => GL_LUMINANCE
            face->glyph->bitmap.width,
            face->glyph->bitmap.rows,
            0,
            GL_RGB,                        => GL_LUMINANCE
            GL_UNSIGNED_BYTE,
            face->glyph->bitmap.buffer
    );