Lazyfoo SDL2 / GLSL代码仅在OS X上显示黑屏

时间:2014-11-12 11:58:18

标签: macos opengl glsl sdl sdl-2

滚动到底部寻求解决方案

我见过几个类似的问题(this是最接近的),但还没有找到答案。我有一些代码可以在Windows和Linux上成功运行,但是当我在OS X(10.9,Mavericks)上运行时,我只是得到一个黑屏。

我正在直接从Lazyfoo复制第51个SDL2教程,found here(源代码位于页面底部)。

我对他的代码所做的唯一更改是修复某些包含:

#include <SDL.h> ==> #include <SDL2/SDL.h>
#include <gl\glew.h> ==> #include <GL/glew.h>
#include <SDL_opengl.h> ==> #include <SDL2/SDL_opengl.h>
#include <gl\glu.h> ==> #include <OpenGL/glu.h>

我使用g ++编译程序,我从brew(4.9)

开始
g++ 51_SDL_and_modern_opengl.cpp -lSDL2 -lGLEW -framework OpenGL

我对这个问题有几个怀疑:

  1. 我正在使用SDL2(从brew下载)的OpenGL标头。我也有GLEW的brew,但我使用Apple的默认glu。
  2. 我的OS X版本无法处理OpenGL 3.3,或者它想要3.2
  3. 对于第二个,glGetString(GL_VERSION)和glGetString(GL_SHADING_LANGUAGE_VERSION)的输出是:

    GL版本:3.3 NVIDIA-8.24.16 310.90.9.05f01

    GLSL版本:3.30

    我尝试将SDL调用中的次要版本切换为2,但这并没有解决它。我也尝试将版本更改为#version 330而不是#version 140,但仍然没有。

    无所谓我的意思是我得到一个黑屏,但程序编译。为了记录,我对该样本的期望是白色方块。 Lazyfoo有一个教程(前一个,编号50),他使用OpenGL 2.1绘制白色方块,并且该代码在Apple机器上按预期运行。

    感谢任何帮助。我正在辩论要求Lazyfoo自己,但这似乎是他现在正在努力的事情。

    ANSWER

    感谢Reto Koradi的回答 - 显然核心配置文件需要使用Vertex Array Objects。我通过改变从第180行开始的代码(以及添加全局VAO GLuint)来实现它:

    //Create VAO
    glGenVertexArrays(1, &gVAO);
    glBindVertexArray(gVAO);
    
    //Create 2 buffers (position, indices)
    GLuint buffers[2];
    glGenBuffers(2, buffers);   
    
    //Create VBO
    glBindBuffer( GL_ARRAY_BUFFER, buffers[0]);
    glBufferData( GL_ARRAY_BUFFER, 2 * 4 * sizeof(GLfloat), vertexData, GL_STATIC_DRAW );
    glEnableVertexAttribArray( gVertexPos2DLocation );
    glVertexAttribPointer( gVertexPos2DLocation, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), NULL );
    
    //Create IBO
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, 4 * sizeof(GLuint), indexData, GL_STATIC_DRAW );
    
    glBindVertexArray(0);
    

1 个答案:

答案 0 :(得分:5)

您尝试使用的教程已损坏。它使用Core Profile创建一个OpenGL上下文(好!),但代码与Core Profile不兼容(糟糕!)。

在核心配置文件中,您需要使用顶点阵列对象(VAO)。在进行任何其他顶点状态设置调用之前,在代码的早期添加这些调用:

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);

这应该至少让你起步并运行。为了更好地使用VAO,您应该移动代码,并在设置期间仅调用glEnableVertexAttribArray()glVertexAttribPointer()之类的调用,同时绑定VAO。他们设定的州将在VAO中进行跟踪。然后每次绘制时,只需再次绑定VAO即可设置所有状态。

最好的方法实际上可能是找到更好的教程。