使用着色器在Windows中而不是在Linux中进行OpenGL渲染

时间:2014-09-21 09:29:09

标签: java linux opengl shader lwjgl

尝试运行简单的Java代码以使用着色器渲染简单的三角形时遇到问题。虽然在Windows中它运行良好screenshot,但在Linux中它不显示任何东西,只有黑屏。

我使用的是Ubuntu 14.10和Mesa 10.1.3,以及lwjgl作为框架。

以下是我的主要绘图功能的代码:

private static void render() {
     GL20.glEnableVertexAttribArray(0);

     GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vbo);
     GL20.glVertexAttribPointer(0, 3, GL11.GL_DOUBLE, false, Vertex.BYTES, 0);

     GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, ibo);

     GL11.glDrawElements(GL11.GL_TRIANGLES, vertices.size(), GL11.GL_UNSIGNED_INT, 0);

     GL20.glDisableVertexAttribArray(0);
}

以下是用于测试目的的简单代码的完整版本:code

编辑:在不同时间运行相同的代码之后,其中一个人绘制了this,而我还没有能够复制它。

3 个答案:

答案 0 :(得分:2)

您错过了glClear()。在render()函数的开头添加:

GL15.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

在不清除缓冲区的情况下,内容将是任意数据。特别是如果深度缓冲区未被清除,它可能包含的深度值都小于三角形的深度,并且不会绘制任何内容。

另一个问题是您正在创建核心配置文件上下文:

 ContextAttribs contextAtrributes = new ContextAttribs(3, 3).withProfileCore(true);

但您的代码不符合Core Profile。您需要创建一个使用顶点数组对象(VAO)。在不使用VAO的情况下设置顶点状态在现代OpenGL中已弃用,并且在Core Profile中不受支持。在设置开始时,您将需要这样的代码:

int vao = GL30.glGenVertexArrays();
GL30.glBindVertexArray(vao);

不是一个会阻止代码工作的问题,但我也建议使用浮点值作为坐标。您指定的double值将由OpenGL强制转换为浮点值。因此,您只需创建额外的开销,并使用更多的内存,通过双打操作。

答案 1 :(得分:2)

现在最大的问题是你有一个核心配置文件上下文,但你没有使用顶点数组对象。为什么Windows允许这样做很难说,但Linux正在给出你期望的行为。

您需要在软件中至少创建一个Vertex Array对象并将其绑定一次,因为这是编写 3.3核心配置文件 软件所必需的步骤。

如果将其添加到Main.create (...),您将拥有符合标准的3.3核心代码:

int vao = GL30.glGenVertexArrays ();
GL30.glBindVertexArray (vao);

答案 2 :(得分:1)

首先要做的事情:检查是否正确支持OpenGL。运行glxinfo命令并在此处发布其输出;你可以安全地省略支持的帧缓冲格式(GLXVisuals和GLXFBConfigs)的冗长列表。

一种可能性是,您在合成环境中运行并且不使用双缓冲。实际上,单个缓冲渲染和窗口组合是在天堂中进行的匹配,因为组合步骤非常类似于缓冲交换,但现有驱动程序和API的设计使得在完成渲染和组合之间难以同步,因此双缓冲区交换被重新利用。