C++ 调用glGenFramebuffers()时出现SEGFULT?
我想在3D的基础上再做一些2D,这样我就可以做一个像样的GUI了。所以我创建了纹理等等 我可以编译代码,它不会产生错误。但当我运行程序时,一切正常,直到我称之为:C++ 调用glGenFramebuffers()时出现SEGFULT?,c++,opengl,sdl,glew,C++,Opengl,Sdl,Glew,我想在3D的基础上再做一些2D,这样我就可以做一个像样的GUI了。所以我创建了纹理等等 我可以编译代码,它不会产生错误。但当我运行程序时,一切正常,直到我称之为: glGenFramebuffers(1, &fb); 然后出现以下情况: error 139 segmentation fault (core dumped). 有人知道代码出了什么问题吗 std::cout << "test1" << std::endl; unsigned int fb; gl
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);
纹理.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
#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;
}
您正在#包括ing a,然后:
- 在拥有当前GL上下文之前尝试初始化它(保留函数指针,如
glGenFramebuffers()
NULL),或
- 忘记完全初始化它,或者
- (不太可能,除非你正在做一些傻事,比如试图通过远程桌面使用OpenGL)正确地初始化你的扩展加载程序,但使用不支持核心FBO的GL实现
编辑哦,嘿,是#2
您需要在SDL\u SetVideoMode()之后调用。您还应该使用GLEW版本检查功能来验证底层GL实现的版本是否支持核心FBO(它们在OpenGL 2.1 IIRC中加入)。您正在#包括ing a,然后:
- 在拥有当前GL上下文之前尝试初始化它(保留函数指针,如
glGenFramebuffers()
NULL),或
- 忘记完全初始化它,或者
- (不太可能,除非你正在做一些傻事,比如试图通过远程桌面使用OpenGL)正确地初始化你的扩展加载程序,但使用不支持核心FBO的GL实现
编辑哦,嘿,是#2
您需要在SDL\u SetVideoMode()之后调用。您还应该使用GLEW版本检查功能来验证底层GL实现的版本是否支持核心FBO(它们在OpenGL 2.1 IIRC中提供)。不要使用std::cout
进行调试。它可能不会被执行。使用调试器或std::cerr
。错误可能在下一行的其他地方。向我们展示完整编译main()
,即a所需的代码。OpenGL中的Seg故障通常是在发生故障的行之前的多行错误调用的结果,我们需要查看完整的程序以正确识别问题。不要使用std::cout
进行调试。它可能不会被执行。使用调试器或std::cerr
。错误可能在下一行的其他地方。向我们展示完整编译main()
,即a所需的代码。OpenGL中的Seg故障通常是在发生故障的线路之前的许多线路上发生错误调用的结果,我们需要查看完整的程序以正确识别问题。非常感谢!现在问题解决了,非常感谢!现在问题解决了。
#include "game.h"
int main(int argc, char** argv){
game g;
g.start();
return 0;
}
#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
#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;
}