私はあなたが下に見ることができるこのプログラムを持っています。プログラムは何かをテクスチャにレンダリングし、レンダリングされたテクスチャを描画して表示する必要があります。しかし、glBegin(GL_QUADS) を呼び出すと、プログラムは display() 関数で失敗します。プログラムは印刷を終了します
ElectricFence Aborting: free(96f110): address not from malloc().
Ungültiger Maschinenbefehl (Speicherabzug geschrieben)
英語では、これは次のような意味になります
invalid machine command (dump written)
.
#include "GL/glew.h"
#include "GL/glext.h"
#include "GL/glu.h"
#include "GL/glut.h"
#include <cstdio>
uint16_t tex_width = 75;
uint16_t tex_height = 24;
GLuint texture;
void render_texture()
{
GLuint framebuffer = 0;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex_width, tex_height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
GLenum draw_buffers[1] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, draw_buffers);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
fprintf(stderr, "[render_texture] Fehler im Framebuffer\n");
exit(1);
}
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glViewport(0, 0, tex_width, tex_height);
glColor4f(0.8f, 0.0f, 0.8f, 0.5f);
glBegin(GL_POLYGON);
glVertex2f(0.f,0.f);
glVertex2f(tex_width, 0.0f);
glVertex2f(tex_width, (GLfloat)tex_height/2.f);
glVertex2f(tex_width-(GLfloat)tex_height/2.f, tex_height);
glVertex2f(0, tex_height);
glEnd();
}
void display(void)
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT/* | GL_DEPTH_BUFFER_BIT*/);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, glutGet(GLUT_WINDOW_WIDTH), 0.0, glutGet(GLUT_WINDOW_HEIGHT), -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
// Draw a textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(0, 1); glVertex3f(0, tex_width, 0);
glTexCoord2f(1, 1); glVertex3f(tex_height, tex_width, 0);
glTexCoord2f(1, 0); glVertex3f(tex_height, 0, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glutSwapBuffers();
}
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE/* | GLUT_DEPTH*/);
glutInitWindowSize(1024, 1024);
glutCreateWindow("texture copy test");
glutDisplayFunc(display);
glewInit();
render_texture();
glutMainLoop();
}
次のコマンドでコードをコンパイルしました
g++ -o test test.cpp -std=c++11 -lpng -lGL -lglut -lGLEW -lGLU -lefence -g
gdb は [rejak@localhost src]$ gdb ./test GNU gdb (GDB) 7.6.1 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later http://gnu.org /licenses/gpl.html これはフリー ソフトウェアです。自由に変更して再配布してください。法律で許可されている範囲で、保証はありません。詳細については、「コピーを表示」および「保証を表示」と入力してください。この GDB は「x86_64-unknown-linux-gnu」として構成されました。バグ報告の手順については、 http ://www.gnu.org/software/gdb/bugs/ を参照してください。... /home/rejak/projects/glwidgets/src/test からのシンボルの読み取り...完了。(gdb) run プログラムの開始: /home/rejak/projects/glwidgets/src/./test 警告: 0x7ffff7ffa000 にある追加されたシンボル ファイル システム提供の DSO に読み込み可能なセクションが見つかりません 警告: linux-vdso の共有ライブラリ シンボルを読み込めませんでした.so.1. 「set solib-search-path」または「set sysroot」が必要ですか? [libthread_db を使用したスレッド デバッグを有効にする] ホスト libthread_db ライブラリ "/usr/lib/libthread_db.so.1" を使用します。
ElectricFence Aborting: free(769110): address not from malloc().
Program received signal SIGILL, Illegal instruction.
0x00007ffff645c6c7 in kill () from /usr/lib/libc.so.6
(gdb) q
A debugging session is active.
Inferior 1 [process 1350] will be killed.
Quit anyway? (y or n) y
[rejak@localhost src]$ gdb ./test
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/rejak/projects/glwidgets/src/test...done.
(gdb) run
Starting program: /home/rejak/projects/glwidgets/src/./test
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
ElectricFence Aborting: free(769110): address not from malloc().
Program received signal SIGILL, Illegal instruction.
0x00007ffff645c6c7 in kill () from /usr/lib/libc.so.6
(gdb) bt full
#0 0x00007ffff645c6c7 in kill () from /usr/lib/libc.so.6
No symbol table info available.
#1 0x00007ffff6ff14ad in ?? () from /usr/lib/libefence.so.0
No symbol table info available.
#2 0x00007ffff6ff18c7 in EF_Abortv () from /usr/lib/libefence.so.0
No symbol table info available.
#3 0x00007ffff6ff1968 in EF_Abort () from /usr/lib/libefence.so.0
No symbol table info available.
#4 0x00007ffff6ff0eda in free () from /usr/lib/libefence.so.0
No symbol table info available.
#5 0x00007ffff2a53e68 in _mesa_align_realloc () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#6 0x00007ffff2bced4c in _mesa_add_parameter () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#7 0x00007ffff2bceefa in _mesa_add_state_reference () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#8 0x00007ffff2fedb29 in ?? () from /usr/lib/xorg/modules/dri/i965_dri.so
No symbol table info available.
#9 0x00007ffff2bc4882 in _mesa_glsl_link_shader () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#10 0x00007ffff2a38c33 in _mesa_get_fixed_func_fragment_program () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#11 0x00007ffff2a86f68 in _mesa_update_state_locked () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#12 0x00007ffff2a87041 in _mesa_update_state () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#13 0x00007ffff2ac5a08 in ?? () from /usr/lib/libdricore9.2.0.so.1
No symbol table info available.
#14 0x0000000000401675 in display () at test.cpp:75
No locals.
#15 0x00007ffff7720ac4 in ?? () from /usr/lib/libglut.so.3
No symbol table info available.
#16 0x00007ffff7724329 in fgEnumWindows () from /usr/lib/libglut.so.3
No symbol table info available.
#17 0x00007ffff772107d in glutMainLoopEvent () from /usr/lib/libglut.so.3
No symbol table info available.
#18 0x00007ffff772187d in glutMainLoop () from /usr/lib/libglut.so.3
No symbol table info available.
#19 0x00000000004017b3 in main (argc=1, argv=0x7fffffffe6e8) at test.cpp:110
No locals.
(gdb) list 75
70 glEnable(GL_TEXTURE_2D);
71 glActiveTexture(GL_TEXTURE0);
72 glBindTexture(GL_TEXTURE_2D, texture);
73
74 // Draw a textured quad
75 glBegin(GL_QUADS);
76 glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
77 glTexCoord2f(0, 1); glVertex3f(0, tex_width, 0);
78 glTexCoord2f(1, 1); glVertex3f(tex_height, tex_width, 0);
79 glTexCoord2f(1, 0); glVertex3f(tex_height, 0, 0);
(gdb)