我的项目中存在问题,使用qt 5.5.1和openGL GLSL。我尝试显示天空盒,所以我创建了一个类。这个继承到QOpenGLFunctions_3_1。这最后一个类包含很多gl函数。现在在我的skybox构造函数上,我初始化我的数组(顶点和索引),然后我这样做:
glGenVertexArrays(1, &m_vaoHandle);
glBindVertexArray(m_vaoHandle);
GLuint handle[2] = {0, 1};
glGenBuffers(2, handle);
glBindBuffer(GL_ARRAY_BUFFER, handle[0]);
glBufferData(GL_ARRAY_BUFFER, 24 * 3 * sizeof(float), v, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), el, GL_STATIC_DRAW);
我对第二行有读取访问权限。如果我将两个第一行放在末尾,则会向第一个glBindBuffer显示读取访问冲突... 一个解决方案是使用glew,但我不想。我把代码带到一个没有使用这个库的初始代码(OpenGL 4.0 Shading Cookbook)。你知道我怎么解决它吗?
答案 0 :(得分:0)
在大多数情况下我得到错误的问题是我试图在OpenGl设置之前初始化一些东西。在你的情况下,我认为问题将是你的天空盒'在设置Glew up或GLUT之前调用顶点数组的初始化。这些作为glGenVertexArrays的OpenGl函数不是直接来自opengl32.dll,它可以从GPU加载,因此必须正确初始化,因此如果不进一步初始化就无法使用它。
答案 1 :(得分:0)
我忘记了initializeOpenGLFunctions();线。使用QOpenGLFunctions_3_1函数在每个类中都需要这一行,而不仅仅是在openGL管道的开头。