0

我有这个程序,你可以在下面看到。程序应该将某些东西渲染到纹理上,并且应该绘制渲染的纹理以显示。但是程序在调用 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 版权所有 (C) 2013 Free Software Foundation, Inc. 许可证 GPLv3+:GNU GPL 版本 3 或更高版本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) 运行启动程序:/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) 
4

2 回答 2

0

现在它可以工作了

glewExperimental=true;
GLenum err=glewInit();
if(err!=GLEW_OK)
{
   //Problem: glewInit failed, something is seriously wrong.
   fprintf(stderr, "glewInit failed, aborting.\n");
}


#include "GL/glew.h"
#include "GL/glext.h"
#include "GL/glu.h"
#include "GL/freeglut.h"

#include <cstdio>

uint16_t tex_width = 75;
uint16_t tex_height = 24;

GLuint texture;

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


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(1.0f, 0.0f, 1.0f, 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();
}


int main(int argc, char **argv)
{

   glutInit(&argc, argv);
   glutInitContextVersion(3, 1);
   glutInitContextProfile(GLUT_CORE_PROFILE);
   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE/* | GLUT_DEPTH*/);
   glutInitWindowSize(1024, 1024);
   glutCreateWindow("texture test");
   glutDisplayFunc(display);

   glewExperimental=true;
   GLenum err=glewInit();
   if(err!=GLEW_OK)
   {
      //Problem: glewInit failed, something is seriously wrong.
      fprintf(stderr, "glewInit failed, aborting.\n");
   }

   render_texture();


   glutMainLoop();
}
于 2013-09-21T09:08:27.343 回答
0

当心使用GL_QUADS它现在支持取决于您的 OpenGL 版本。尝试首先修复您使用的 OpenGL 版本,然后看看接下来会发生什么。

glutInitContextVersion(3, 3);
glutInitContextProfile(GLUT_CORE_PROFILE);

3.3 就是一个例子。事实上,我不确定GL_QUADS这个实现版本是否存在。

于 2013-09-20T12:08:47.047 回答