【问题标题】:Lazyfoo SDL2/GLSL code shows black screen on OS X onlyLazyfoo SDL2/GLSL 代码仅在 OS X 上显示黑屏
【发布时间】: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

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

  1. 我正在使用 SDL2(从 brew 下载)的 OpenGL 标头。我也得到了 GLEW 的 brew,但我使用的是 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,但仍然没有。

我的意思是我得到一个黑屏,但程序编译。作为记录,我对该样本的期望是一个白色方块。 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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我试过 opengl-tutorial.org,但同样的问题。如何确保函数属于核心而不是兼容模式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
相关资源
最近更新 更多