调用 glGenFramebuffers() 时的 Segfault
Segfault when calling glGenFramebuffers()?
我想在3D之上做一些2D,这样我就可以做一个像样的GUI。所以我创建了纹理等等。
我可以编译代码,它不会产生错误。 但是当我运行程序时,一切都很好,直到我称之为:
glGenFramebuffers(1, &fb);
然后出现:
error 139 segmentation fault (core dumped).
有人知道代码出了什么问题吗?
std::cout << "test1" << std::endl;
unsigned int fb;
glGenFramebuffers(1, &fb);
std::cout << "test2" << std::endl;
glBindRenderbuffer(GL_RENDERBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture.getId(), 0);
显示"test1"文本,但不显示"test2"。
法典:
游戏.cpp
#include "game.h"
game::game(){
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen = SDL_SetVideoMode(1000, 600, 32, SDL_SWSURFACE|SDL_OPENGL);
glClearColor(0.5, 0.5, 0.5, 1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, 1000.0/600.0, 1.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
}
game::~game(){
SDL_Quit();
}
void game::start(){
Uint32 start;
SDL_Event event;
texture renderTexture = texture();
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1000, 600, 0, GL_BGRA, GL_UNSIGNED_BYTE, 0);
std::cerr << "test1" << std::endl;
unsigned int fb;
glGenFramebuffers(1, &fb);
std::cerr << "test2" << std::endl;
glBindRenderbuffer(GL_RENDERBUFFER, fb);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderTexture.getId(), 0);
bool running = true;
while (running){
start = SDL_GetTicks();
while (SDL_PollEvent(&event)){
switch (event.type){
case SDL_QUIT:
running = false;
break;
}
}
update();
show(fb);
showMenu();
SDL_GL_SwapBuffers();
if (1000/30 > (SDL_GetTicks()-start)){
SDL_Delay(1000/30 - (SDL_GetTicks()-start));
}
}
}
void game::update(){
}
void game::show(unsigned int fb){
glBindFramebuffer(GL_FRAMEBUFFER, fb);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
void game::showMenu(){
bindWindowAsRenderTarget();
glViewport(0, 0, 1000, 600);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1000.0, 0.0, 600.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void game::bindWindowAsRenderTarget(){
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glViewport(0, 0, 1000, 600);
}
游戏.h
#ifndef GAME_H_INCLUDED
#define GAME_H_INCLUDED
#include <iostream>
#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "texture.h"
class game{
void update();
void show(unsigned int fb);
void showMenu();
void bindWindowAsRenderTarget();
public:
game();
~game();
void start();
};
#endif // GAME_H_INCLUDED
主.cpp
#include "game.h"
int main(int argc, char** argv){
game g;
g.start();
return 0;
}
质地.cpp
#ifndef TEXTURE_H_INCLUDED
#define TEXTURE_H_INCLUDED
#include <SDL/SDL.h>
#include <GL/glew.h>
#include <GL/gl.h>
#include <GL/glu.h>
class texture{
unsigned int id;
public:
texture();
~texture();
void loadImage(const char* filename);
unsigned int getId();
};
#endif // TEXTURE_H_INCLUDED
质地.cpp
#include "texture.h"
texture::texture(){
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
}
texture::~texture(){
glDeleteTextures(1, &id);
}
void texture::loadImage(const char* filename){
SDL_Surface* img = SDL_LoadBMP(filename);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->w, img->h, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, img->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
SDL_FreeSurface(img);
}
unsigned int texture::getId(){
return id;
}
美元到您正在#include
GL 扩展加载器(GLEW、GLAD 等)的甜甜圈,然后:
- 尝试在拥有当前 GL 上下文之前对其进行初始化(保留像
glGenFramebuffers()
NULL 这样的函数指针),或者 - 忘记完全初始化它,或者
- (不太可能,除非您正在做一些愚蠢的事情,例如尝试通过远程桌面使用 OpenGL)正确启动扩展加载程序,但使用不支持核心 FBO 的 GL 实现
编辑哦,嘿,这是#2。
您需要在SDL_SetVideoMode()
后致电glewInit()
。 您还应该使用 GLEW 版本检查函数来验证底层 GL 实现的版本是否支持核心 FBO(它们在 OpenGL 2.1 IIRC 中提供)。
相关文章:
- 使用 gmock 时的 SegFault
- 使用std :: to_string()创建std :: String时的segfault
- 创建二进制树时意外的segfault
- 使用带有编译器优化的 std::function 类成员时出现 Segfault
- 呼叫时的segfault,但不跳到rax中的地址
- 组合OpenGL和QML时,gldrawarrays上的segfault
- 调用 glGenFramebuffers() 时的 Segfault
- 分类向量时的segfault
- 删除指向流的类成员指针时出现Segfault
- 尝试访问QGraphicsTextItem的成员时出现segfault
- 尝试从插入的.dll中的指针读取字符串时出现Segfault
- 使用共享指针访问单例子类时的SEGFAULT
- 静态初始化期间将 gcc 构建的 Boost 链接到英特尔 C++ 编译程序时出现 Segfault
- 尝试访问向量中对象中的字段时出现Segfault
- 访问成员stl映射时的C++Segfault
- 在反转具有给定大小的链接列表时发生Segfault
- 在嵌入式Linux上使用C++Std Lib时出现异常的segfault
- OpenGL-加载顶点数据时glBufferData()上的SegFault
- 使用mmap时的segfault
- 读取由相同代码创建的二进制文件时出现segfault