滚动到底部寻求解决方案
我见过几个类似的问题(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
我对这个问题有几个怀疑:
对于第二个,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自己,但这似乎是他现在正在努力的事情。
ANSWER
感谢Reto Koradi的回答 - 显然核心配置文件需要使用Vertex Array Objects。我通过改变从第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);
答案 0 :(得分:5)
您尝试使用的教程已损坏。它使用Core Profile创建一个OpenGL上下文(好!),但代码与Core Profile不兼容(糟糕!)。
在核心配置文件中,您需要使用顶点阵列对象(VAO)。在进行任何其他顶点状态设置调用之前,在代码的早期添加这些调用:
GLuint vaoId = 0;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
这应该至少让你起步并运行。为了更好地使用VAO,您应该移动代码,并在设置期间仅调用glEnableVertexAttribArray()
和glVertexAttribPointer()
之类的调用,同时绑定VAO。他们设定的州将在VAO中进行跟踪。然后每次绘制时,只需再次绑定VAO即可设置所有状态。
最好的方法实际上可能是找到更好的教程。