我用java8和LWJGL制作了一个带有GLFW和OpenGL的游戏引擎。我有一个通用的IndexedVAO类,里面有我所有的VAO代码,以简化事情。以下是相关部分:
建造师
GL30.glBindVertexArray(vertexArrayObject);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferObject);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
for(VertexAttribPointer prr : format.parts) {
GL20.glEnableVertexAttribArray(prr.index);
GL20.glVertexAttribPointer(prr.index, prr.size, prr.type,
prr.normalized, prr.stride, prr.ptr);
}
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL30.glBindVertexArray(0);
上传功能
data.flip();
index.flip();
this.numberOfIndicies = index.limit() / 2;
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferObject);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, bufferUse);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, index, bufferUse);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
绘图函数
GL30.glBindVertexArray(vertexArrayObject);
GL11.glDrawElements(this.drawmode, this.numberOfIndicies, GL11.GL_UNSIGNED_SHORT, 0L);
GL30.glBindVertexArray(0);
这两台机器之间的一个主要硬件区别是,windows机器有一个较旧的radeon图形卡,linux机器有一个最新的geforce卡,两者都有最新的驱动程序。我在radeon机器上启动linux,看看厂商之间是否存在不一致,但当我等了30分钟让java安装完毕后,一切正常,这意味着这是特定于操作系统的。为了验证我让我的朋友在他的Windows10机器上测试了它,他也得到了异常访问违规。
热释光;DR:上面的代码在linux上运行,但在windows上它会导致异常\访问\违反jvm崩溃