Opengl 仅在具有LWJGL3的NVIDIA卡上调用glfwSwapBuffers时发生访问冲突

Opengl 仅在具有LWJGL3的NVIDIA卡上调用glfwSwapBuffers时发生访问冲突,opengl,lwjgl,Opengl,Lwjgl,很抱歉打扰你,我一个人没法修好。 我认为问题与所描述的问题相似,但不幸的是,没有有效的答案。 当我使用Intel图形卡时,我的程序运行得非常好,但当我使用nvidia图形卡(rtx 3080)时,它在调用glfwSwapBuffers时崩溃。我做了一些调试,我发现故障是水元素调用。 更奇怪的是,该程序不会立即崩溃,但它可以成功地渲染一些水砖(地形渲染没有任何问题)。 当我开始使用两个opengl上下文时出现了这个问题,一个用于在vbos中加载顶点,另一个用于渲染。我不明白的是,为什么它只适用于非

很抱歉打扰你,我一个人没法修好。 我认为问题与所描述的问题相似,但不幸的是,没有有效的答案。 当我使用Intel图形卡时,我的程序运行得非常好,但当我使用nvidia图形卡(rtx 3080)时,它在调用glfwSwapBuffers时崩溃。我做了一些调试,我发现故障是水元素调用。 更奇怪的是,该程序不会立即崩溃,但它可以成功地渲染一些水砖(地形渲染没有任何问题)。 当我开始使用两个opengl上下文时出现了这个问题,一个用于在vbos中加载顶点,另一个用于渲染。我不明白的是,为什么它只适用于非nvidia的图形卡

override fun render() {
        moveFactor += waveSpeed * interval
        shaderProgram.bind()
        shaderProgram.setUniform("reflectionTexture", 0)
        shaderProgram.setUniform("refractionTexture", 1)
        shaderProgram.setUniform("dudvMap",2)
        shaderProgram.setUniform("normalMap",3)
        shaderProgram.setUniform("moveFactor",moveFactor)
        shaderProgram.setUniform("projectionMatrix", GameEngine.projectionMatrix)
        shaderProgram.setUniform("cameraPosition", camera.position)
        entities.forEach { entry ->
            val mesh = entry.key
            initRender(mesh)
            entry.value.forEach { gameItem ->
                val modelViewMatrix = gameItem.transformation.getModelViewMatrix(camera.viewMatrix)
                shaderProgram.setUniform("modelViewMatrix", modelViewMatrix)
                shaderProgram.setUniform("modelMatrix", gameItem.transformation.getModelMatrix())

//-------------> HERE IS WHERE THE PROGRAM CRASH. If I comment that line the glfwSwapBuffer call works fine
                GL13C.glDrawElements(GL13C.GL_TRIANGLES, mesh.vertices.size, GL13C.GL_UNSIGNED_INT, 0)

            }
            endRender()
        }
        shaderProgram.unbind()
    }

    private fun initRender(mesh: Mesh) {
        glEnableClientState(GL_VERTEX_ARRAY)
        glEnableClientState(GL_NORMAL_ARRAY)
        glEnableClientState(GL_TEXTURE_COORD_ARRAY)
        GL30C.glBindVertexArray(mesh.vao.id)
        GL13C.glActiveTexture(GL13C.GL_TEXTURE0)
        GL13C.glBindTexture(GL13C.GL_TEXTURE_2D, waterFrameBuffers.reflectionTexture)
        GL13C.glActiveTexture(GL13C.GL_TEXTURE1)
        GL13C.glBindTexture(GL13C.GL_TEXTURE_2D, waterFrameBuffers.refractionTexture)
        GL13C.glActiveTexture(GL13C.GL_TEXTURE2)
        GL13C.glBindTexture(GL13C.GL_TEXTURE_2D, dudvTexture.id)
        GL13C.glActiveTexture(GL13C.GL_TEXTURE3)
        GL13C.glBindTexture(GL13C.GL_TEXTURE_2D, normalMap.id)
        GL11C.glEnable(GL30C.GL_CLIP_DISTANCE0)
    }

    private fun endRender() {
        glDisableClientState(GL_VERTEX_ARRAY)
        glDisableClientState(GL_NORMAL_ARRAY)
        glDisableClientState(GL_TEXTURE_COORD_ARRAY)
        GL11C.glDisable(GL30C.GL_CLIP_DISTANCE0)
    }
NVIDIA的图形卡在渲染前后是否需要调用特定的opengl函数?
我使用的是LWJGL3,但我不认为这是绑定问题,这就是为什么我还添加了opengl标记(我可能是错的,因此如果我不适当地使用了opengl标记,我向您道歉)。

既然您谈到了多个上下文,我假设您使用的是多个线程:它们是否正确同步?特别是对GLD元素使用的数组的写访问?对glfwSwapBuffers的调用具体发生在哪里(在哪个线程上)?是的,它们已正确同步。在第一个上下文中调用glfwSwapBuffers,该上下文也调用glpaurements。第二个上下文调用glBufferData方法,然后将网格对象存储在ConcurrentLinkedQueue中;每个更新周期的第一个上下文轮询网格,缓冲其索引,然后将其标记为准备渲染。我知道这有点棘手,但是VAO不是在上下文之间共享的,所以我必须在第一个上下文中完成网格的缓冲。从来没有并发修改异常,也没有两个或多个网格使用的vao/vbo,也没有空vao/vbo指针。我不认为这是同步问题,因为在我的笔记本电脑上工作得非常好。它只是在我的电脑上用nvidia的图形卡(带有最新驱动程序的rtx 3080)崩溃了。“第二个上下文调用glBufferData方法,然后将一个网格对象存储在ConcurrentLinkedQueue中;第一个上下文在每个更新周期轮询一个网格,缓冲其索引,然后将其标记为准备渲染。”但这是不正确的。在第二个线程中完成
glBufferData
调用后,不能保证GL已经完成了缓冲区的更新(此时可以保证的是GL已经消耗了您的用户空间缓冲区数据,因此您可以在之后进行更改)。你需要使用GL同步原语来实现这一点。“我不认为这是一个同步问题,因为在我的笔记本电脑上工作得非常好。”竞争条件的本质是,它们对各种时间和外部因素极其敏感。