SDL和绑定缓冲区

SDL and binding buffers

本文关键字:缓冲区 绑定 SDL      更新时间:2023-10-16

所以我一直在尝试理解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这样的母语,你会看到很多,所以花一些时间学习如何使用调试器(如果你还不知道的话)会为你(和其他人,请注意)节省很多时间。