SDL 和绑定缓冲区
Posted
技术标签:
【中文标题】SDL 和绑定缓冲区【英文标题】:SDL and binding buffers 【发布时间】:2014-10-29 23:02:35 【问题描述】:所以我一直在尝试理解 SDL 接口并将我的 OpenGL 和 freeglut 测试程序附加到它 - 从 glut 引用中清除它。当我尝试附加着色器时,最有问题的部分变成了 - 一切都在编译,但我不断收到分段错误错误。程序的清理版本是:
#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 8somethingsomething 卡(如果它真的很重要的话)。我用来编译的命令是:
g++ main.cpp -lGL -lGLEW -lSDL2
PS。对不起,我是iostream新手,我是从c++开始编程的。
【问题讨论】:
顺便说一句,“Radeon 8somethingsomething”卡将不支持 OpenGL 3.0(这就是glGenVertexArrays
的来源)。 9xxx 系列在技术上并不支持 GL 2.0 所需的一切。
【参考方案1】:
您永远不会为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://***.com/a/26645107/524368
【讨论】:
不,仍然是分段错误。不过谢谢你的建议。 @CheshireCat:与其说是错误检查,不如说是您创建了一个窗口,然后……您松散地丢弃了指向由 SDL 创建的 Window 对象的指针。变量window
永远不会看到有效值,而您传递给SDL_GL_CreateContext
的内容比垃圾还糟糕。您正在调用语言未定义的行为,编译器将完全有权创建程序二进制文件,例如,在执行时会擦除它可以找到的硬盘中的任何内容。
@CheshireCat:keltar 还发现了一些重要的东西。阅读他的回答。无论如何,您确实应该检查错误并保留函数调用的结果。【参考方案2】:
glGenVertexArrays
是扩展函数。你已经包含了glew.h
,它处理扩展——但你还没有初始化它。 glewInit
必须在创建 GL 上下文后调用(并检查其返回值)。
还有一点建议 - 分段错误并不是什么奇怪的魔法,你应该害怕并用谷歌搜索到底发生了什么。它的定义非常好。如果您将在调试器中运行您的程序,您将看到它究竟在哪里崩溃以及为什么崩溃(因为调用了glGenVertexArrays
函数,但该函数指针的值为 NULL)。如果你使用像 C 这样的本地语言,你会看到很多,所以花一些时间学习如何使用调试器(如果你还不知道的话)将为你(和其他人,请注意)节省很多时间稍后。
【讨论】:
以上是关于SDL 和绑定缓冲区的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0