【发布时间】:2014-11-12 11:58:17
【问题描述】:
滚动到底部以获取解决方案
我见过几个类似的问题(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 标头。我也得到了 GLEW 的 brew,但我使用的是 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,但仍然没有。
我的意思是我得到一个黑屏,但程序编译。作为记录,我对该样本的期望是一个白色方块。 Lazyfoo 有一个教程(上一个,编号 50),其中他使用 OpenGL 2.1 绘制一个白色正方形,并且该代码在 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);
【问题讨论】:
-
请注意,在 2021 年 12 月,添加此代码片段并不能解决问题。还尝试从stackoverflow.com/q/48714591/1541769 更新着色器/片段着色器程序并修复变量名称以匹配此处使用的名称也不起作用。编译正常,运行无错误,但黑屏。
标签: macos opengl glsl sdl sdl-2