c++ - opengl 程序在 glBegin(GL_QUADS) 上崩溃

标签 c++ linux opengl textures render

我有这个程序,您可以在下面看到。程序应该将某些内容渲染到纹理,并且渲染的纹理应该被绘制以显示。但是当调用 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 自由软件基金会, 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) 

最佳答案

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

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

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

关于c++ - opengl 程序在 glBegin(GL_QUADS) 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18916247/

相关文章:

linux - 更改Linux中无主文件的文件权限

linux - 在同一个 Linux 目录中有数百或数千个文件是否可以(性能方面)?

opengl - 为什么在使用 FBO 进行多重采样时 OpenGL 会照亮我的场景?

opengl - 根据 2D 纹理的值对 1D 纹理进行采样

c++ - 纹理在 Qt 中缩放而不是重复

c++ - 将内联 ASM 转换为 x64 igraph 的内在

c++ - 指定指向二维数组的指针

c++ - 使用 Android NDK 构建 mariadb 客户端

c++ - header 中的内联和 constexpr 无捕获 lambda 有什么区别?

linux - 在 chroot 环境中使用 SSH 进行 SFTP 和端口转发