滚动到底部查看解决方案
我见过几个类似的问题(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
我对这个问题有几个怀疑:
- 我正在使用 SDL2(从 brew 下载)的 OpenGL header 。我也得到了 brew 的 GLEW,但我使用的是 Apple 的默认 glu。
- 我的 OS X 版本无法处理 OpenGL 3.3,或者它需要 3.2
至于第二个,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,但仍然没有。
我的意思不是黑屏,而是程序编译。作为记录,我对该样本的期望是一个白色方 block 。 Lazyfoo 有一个教程(上一个,编号 50),其中他使用 OpenGL 2.1 绘制一个白色方 block ,并且该代码在 Apple 机器上按预期运行。
感谢任何帮助。我正在考虑问 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);
最佳答案
您尝试使用的教程已损坏。它使用 Core Profile 创建 OpenGL 上下文(好!),但代码与 Core Profile 不兼容(坏!)。
在 Core Profile 中,您需要使用 Vertex Array Objects (VAO)。在进行任何其他顶点状态设置调用之前,在代码的早期添加这些调用:
GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
这至少能让您启动并运行。要更好地使用 VAO,您应该四处移动代码,并在设置期间仅调用一次 glEnableVertexAttribArray()
和 glVertexAttribPointer()
,同时绑定(bind) VAO。他们设置的状态将在 VAO 中被跟踪。然后每次绘制时,只需重新绑定(bind)VAO即可设置所有状态。
最好的方法实际上可能是找到更好的教程。
关于macos - Lazyfoo SDL2/GLSL 代码仅在 OS X 上显示黑屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26886442/