尝试运行简单的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,而我还没有能够复制它。
答案 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的设计使得在完成渲染和组合之间难以同步,因此双缓冲区交换被重新利用。