Sigabrt on glTexImage2D
Sigabrt on glTexImage2D
当我周末离开时,我的代码处于工作状态,自从我回来以来,我一直随机收到此错误。有时它会运行并且我的 android 项目可以工作,有时它不起作用。我目前正在研究 NDK,并试图让 Freetype Lib 工作。通过阅读此堆栈跟踪,这里是我的"相关"代码:
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 Glyphn");
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 的字符处失败。
编辑2:我不知道为什么,但它随机卡在不同的角色上。有时,甚至,它根本不会卡住,只会编译和运行......我什至不知道了。
所以,对于任何可能找到这篇文章的人,连续几个小时在网上搜索,我找到了答案。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
);
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 循环挂起迭代的 std::擦除 on std::list
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- std::bind on statd::array 的运算符 []
- 您将如何连接"on the fly"文本+整数并将其传递给函数?
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- VS2019 - Sudo Remote Debugging on Linux with Cmake project
- glTexImage2D 访问违规
- C++ library with Tensorflow on Android
- SFML 交叉编译 for Windows on Linux.
- How to recover system gcc compiler on centos 6
- Cmake with Flex/Bison on windows
- 按原样保存用户输入 - Ruby on Rails
- OpenAL C++ on Linux
- Boost::process on Windows - with MinGW?
- CMake on FindOpenGL.cmake 中的错误,当使用导入的目标 OpenGL::GLU?
- Utilization of atomic_flag on C++
- anaconda cythonize C++ on windows 10
- Sigabrt on glTexImage2D