Here你可以找到一个非常小而愚蠢的程序来表示我在osx 10.10和所有qt库(> 5.0)中遇到的问题。
让我解释一下该计划的目的是什么。它应该在SHARED(和隐藏的......)3d opengl上下文中创建一个三角形,使用顶点缓冲对象作为三角形顶点坐标,使用另一个vbo作为构成三角形的三个顶点索引。另外两个独立的opengl上下文应该呈现相同的三角形而不在GPU内存中复制它。我使用QGLWidget类工具来创建opengl上下文并共享"服务器"使用两个opengl渲染客户端的上下文vbos数据。
代码在Windows 8.1(qt版本5.1 64位),linux mint(qt 5.3),mac osx 10.9(qt 5.4.2)和mac osx 10.10(qt 4.8)中正常工作,但它并不适用在任何qt库的mac osx 10.10中都没有渲染> 5.0。
在代码编写中我必须尊重一些额外的信息和约束。在文件glarea.cpp函数Triangle :: create你可以找到
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*9, NULL, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(GLfloat)*9, pvertex);
glBindBuffer(GL_ARRAY_BUFFER,0);
很明显,我可以使用glBufferData函数直接将顶点坐标传递给opengl,而不是仅使用此函数调用分配GPU内存空间并使用glBufferSubData函数有效地复制顶点坐标,但我必须将代码拆分为这种方式的原因取决于整个系统的软件架构。我还注意到在GLArea :: paintGL()中调用glClear函数会导致一个"无效的可绘制缓冲区" opengl错误。这是由qt库的mac版本引起的众所周知的问题。我提前感谢每个人都会浪费时间来帮助我。
PS我想让所有下载文件的人放心,它只包含一些 .cpp, .h和qt项目文件。根本没有武装病毒:)