首页 文章

opengl程序在glBegin上崩溃(GL_QUADS)

提问于
浏览
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这是免费软件:你可以自由更改并重新分发它 . 在法律允许的范围内,不提供任何担保 . 输入"show copying"和"show warranty"了解详细信息 . 此GDB配置为"x86_64-unknown-linux-gnu" . 有关错误报告说明,请参阅:http://www.gnu.org/software/gdb/bugs/ ...从/home/rejak/projects/glwidgets/src/test...done中读取符号 . (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)

2 回答

  • 0

    请注意使用 GL_QUADS 它现在支持取决于您的OpenGL版本 . 首先尝试修复您使用的OpenGL版本,看看接下来会发生什么 .

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

    3.3是一个例子 . 实际上我不确定这个实现版本是否存在 GL_QUADS .

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

相关问题