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

标签 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 header 。我也得到了 brew 的 GLEW,但我使用的是 Apple 的默认 glu。
  2. 我的 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/

相关文章:

javascript - 如何以编程方式删除 <H1>~<H6> 标签?

macos - 如何使用 NSFilePromiseProvider 写入粘贴板

opengl - 用于数组大小的专门化常量

c++ - 间歇性 GLSL 顶点着色器编译错误

glsl - 检查属性是否提供给着色器

c++ - 关于 sizeof 运算符的困惑

python - pyobjc-3.0.3 不会安装在 OS X 10.10 上

opengl - 填充 AVFrame.data 的最佳方法是什么

c++ - Linux C++ 上 Gtkmm 中的 OpenGL 模板缓冲区

c++ - 在 OpenGL 中定位对象数组