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

Macos Lazyfoo SDL2/GLSL代码仅在OS X上显示黑屏,macos,opengl,glsl,sdl,sdl-2,Macos,Opengl,Glsl,Sdl,Sdl 2,滚动至底部以获取解决方案 我见过几个类似的问题是最接近的,但还没有找到答案。我已经有了一些在Windows和Linux上成功运行的代码,但是当我在OSX10.9上运行它时,Mavericks我只是得到了一个黑屏 我直接从Lazyfoo复制了第51个SDL2教程,源代码在页面底部 我对他的代码所做的唯一更改是修复某些问题,包括: #include <SDL.h> ==> #include <SDL2/SDL.h> #include <gl\glew.h>

滚动至底部以获取解决方案

我见过几个类似的问题是最接近的,但还没有找到答案。我已经有了一些在Windows和Linux上成功运行的代码,但是当我在OSX10.9上运行它时,Mavericks我只是得到了一个黑屏

我直接从Lazyfoo复制了第51个SDL2教程,源代码在页面底部

我对他的代码所做的唯一更改是修复某些问题,包括:

#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>
我对这个问题有几点怀疑:

我使用的是从brew的OpenGL标题下载的SDL2。我也得到了brew的GLEW,但我使用的是苹果默认的glu。 我的OS X版本无法处理OpenGL 3.3,或者它需要3.2 对于第二个版本,glGetStringGL_版本和glGetStringGL_着色语言_版本的输出为:

GL版本:3.3 NVIDIA-8.24.16 310.90.9.05f01

GLSL版本:3.30

我尝试将SDL调用中的次要版本切换为2,但这并没有解决问题。我也试着把版本改成330而不是140,但还是一无所获

我的意思是,我得到了一个黑屏,但程序编译。为了记录在案,我希望从这个样本中得到一个白色的正方形。Lazyfoo有上一篇教程,第50篇,他在其中使用OpenGL 2.1绘制一个白色正方形,并且该代码在苹果机器上按预期运行

感谢您的帮助。我在考虑问Lazyfoo自己,但这似乎是他目前正在做的事情

答复

感谢Reto Koradi提供的答案-显然,核心配置文件需要使用顶点数组对象。我通过更改代码(从第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);

您尝试使用的教程已损坏。它创建了一个具有核心配置文件的OpenGL上下文好!,但是代码与核心配置文件不兼容

在核心配置文件中,需要使用顶点数组对象VAO。在代码的早期添加这些调用,然后再进行任何其他顶点状态设置调用:

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
这至少可以让你开始工作。为了更好地使用VAO,您应该在VAO绑定时,移动代码,并在安装过程中仅调用一次glEnableVertexAttribArray和glVertexAttribPointer之类的调用。他们设置的状态将在VAO中跟踪。然后每次绘制时,只需再次绑定VAO即可设置所有状态


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

您尝试使用的教程已损坏。它创建了一个具有核心配置文件的OpenGL上下文好!,但是代码与核心配置文件不兼容

在核心配置文件中,需要使用顶点数组对象VAO。在代码的早期添加这些调用,然后再进行任何其他顶点状态设置调用:

GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
这至少可以让你开始工作。为了更好地使用VAO,您应该在VAO绑定时,移动代码,并在安装过程中仅调用一次glEnableVertexAttribArray和glVertexAttribPointer之类的调用。他们设置的状态将在VAO中跟踪。然后每次绘制时,只需再次绑定VAO即可设置所有状态


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

我尝试了opengl-tutorial.org,但也遇到了同样的问题。如何确保这些函数属于核心模式而不是兼容模式?我已经尝试了opengl-tutorial.org,但也遇到了同样的问题。如何确保这些功能属于核心模式而不是兼容模式?