SDL和绑定缓冲区
SDL and binding buffers
所以我一直在尝试理解SDL接口,并将OpenGL和freeglut测试程序附加到它上——从过多引用中清除它。最有问题的部分是当我尝试附加着色器时——所有的东西都在编译,但我一直得到Segmentation错误。程序的清理版本为:
#include <SDL2/SDL.h>
#include <GL/glew.h>
#include <GL/glu.h>
#include <iostream>
using namespace std;
int main(){
SDL_Window *window;
SDL_GLContext *context;
GLuint vao;
SDL_Init( SDL_INIT_VIDEO );
SDL_CreateWindow("cookie", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
SDL_GL_CreateContext(window);
SDL_GL_SetSwapInterval(1);
cout<<"Hi! It's my first instance"<<endl;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
cout<<"And it's my second - i can't reach here"<<endl;
}
我正在使用Ubuntu 14.04,Radeon 8多岁的显卡(如果真的很重要的话)。我用来编译的命令是:
g++ main.cpp -lGL -lGLEW -lSDL2
PS。很抱歉我是iostream新手,我是从c++开始编程的。
您永远不会为window
赋值。当SDL取消引用传递给SDL_GL_CreateContext
的指针时,它会崩溃,因为window
中没有有效的指针值。
更新(固定代码)
int main(int argc, char *argv[])
{
SDL_Init( SDL_INIT_VIDEO );
SDL_Window * const window = SDL_CreateWindow(
"cookie",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
512, 512,
SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if( !window ) {
cerr << "creating window failed" << endl;
return 1;
}
SDL_GLContext * const context = SDL_GL_CreateContext(window);
if( !context ) {
cerr << "creating OpenGL context failed" << endl;
return 1;
}
/* ... */
更新2
@keltar在这里写道:https://stackoverflow.com/a/26645107/524368
glGenVertexArrays
是扩展函数。您已经包含了处理扩展的glew.h
,但尚未对其进行初始化。必须在创建GL上下文后调用glewInit
(并检查其返回值)。
还有一点建议——分段错误并不是你应该害怕的奇怪魔法,用谷歌搜索到底发生了什么。它的定义非常明确。若您将在调试器中运行程序,您将看到它崩溃的确切位置以及原因(因为调用了glGenVertexArrays
函数,但该函数指针的值为NULL)。如果你使用像C这样的母语,你会看到很多,所以花一些时间学习如何使用调试器(如果你还不知道的话)会为你(和其他人,请注意)节省很多时间。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 在 openGL 中多次绑定缓冲区
- Opengl 3/4 : 我可以将相同的缓冲区对象绑定到不同的目标吗?
- DirectX:如果绑定索引缓冲区但不绑定顶点缓冲区,会发生什么情况
- (DirectX 11)单个顶点缓冲区是否可以一次绑定到多个 IA 输入槽
- 将顶点缓冲区绑定到计算着色器以修改数据
- 为什么在调用 glDrawArray 之前不需要绑定顶点缓冲区对象?
- OpenGL:着色器存储缓冲区映射/绑定
- SDL和绑定缓冲区
- 如何将两个不同的顶点缓冲区绑定到两个槽
- Codegear c++ Builder 2007是否有协议缓冲区绑定?
- 我应该缓存OpenGL状态,比如当前绑定的缓冲区,还是OpenGL会这样做
- OpenGL和C++:实时处理和绑定缓冲区
- OpenGL 将纹理绑定到顶点缓冲区对象(使用 CG 着色器)