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 和绑定缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SDL2 为音频样本提供的缓冲区不够大?

顶点缓冲区对象未在 SDL 窗口中绘制

OpenGL / SDL2:模板缓冲区位在 PC 上始终为 0

高 CPU 使用率 OpenGL Ver 3.1 + SDL2

如何使用 SDL 制作哔声功能?

顶点缓冲区绑定索引和统一缓冲区绑定点?