2016-07-05 12 views
0

Mein Code war in einem funktionierenden Zustand, als ich für das Wochenende ging und seit ich zurückkam habe ich zufällig diesen Fehler bekommen. Manchmal läuft es und mein Android-Projekt funktioniert, manchmal nicht. Ich arbeite gerade an NDK und versuche, Freetype Lib zur Arbeit zu bringen. Aus der Lektüre hier, um diesen Stack-Trace aus ist mein "relevant" Code:Sigabrt on glTexImage2D

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); 
} 

Und hier ist der Stacktrace:

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/[email protected]@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 ## 

Warum manchmal ist es nur nicht?

Edit: Durch die Protokollierung Ich habe festgestellt, dass es bei Zeichen mit ASCII-Code versagt 35.

Edit2: Ich habe keine Ahnung, warum, aber es wird zufällig auf verschiedenen Charakteren stecken. Manchmal, sogar, wird es überhaupt nicht hängen bleiben und wird nur kompilieren und laufen ... Ich weiß nicht einmal mehr.

Antwort

0

Also, für jeden, der diesen Beitrag finden kann, stundenlang im Web schielend, fand ich die Antwort. Freetype ist nicht ausgerichtet (zumindest nicht in meinem Projekt) durch GL_RGB, stattdessen wird durch GL_LUMINANCE ausgerichtet. Indem ich solche Sachen in glTexImage2D änderte, löste ich auf den oben genannten Ausgaben, sowie einigen flippigen Grafikfehlern, die ich erhielt.

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 
    ); 
+0

Im Allgemeinen ist Freetype nicht an das GL_LUMINANCE-Format gebunden, da es unterschiedliche Pixeltypen (einschließlich 1-Bit- oder Palettenfarben) geben kann. Du solltest dein Gesicht überprüfen -> glyph-> bitmap.palette_mode (muss 0 sein) und face-> glyph-> bitmap.num_grays (muss 256 sein). Außerdem empfehle ich, beim Laden einer Textur face-> glyph-> bitmap.width nicht zu verwenden, stattdessen sollte man stattdessen face-> glyph-> bitmap.pitch verwenden (in den meisten Fällen sind sie gleich, im Allgemeinen aber nicht). – Dave