【发布时间】:2018-08-24 15:31:47
【问题描述】:
问候 OpenGL 爱好者!
- 首先我使用LWJGL 2,所以下面是Java代码。
- 第二。我想说我用谷歌搜索了我的每一个问题 将在这篇文章中询问。主要问题是答案不同 彼此相距,所以我无法对事物建立具体的理解 这发生在我下面的代码中。
- 第三。我刚开始学习 OpenGL,我也完全没有 Java 方面的经验。因此,如果您除了对我的问题的解释之外还有任何建议,请随时批评/建议。除了用 C++ 做 OpenGL :)
现在让我们开始吧。
public class Loader {
public void createVAO(int[] indices) {
int vaoID = glGenVertexArrays();
glBindVertexArray(vaoID);
createIndicesVBO(indices);
glEnableVertexAttribArray(0);
}
public void createVBO(float[] vertices) {
int vboID = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboID);
FloatBuffer buffer = makeByteBufferFromArrayOfFloats(vertices);
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0,0);
}
public void createIndicesVBO(int[] indices) {
int vboID = glGenBuffers();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboID);
IntBuffer buffer = makeByteBufferFromArrayOfInts(indices);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
}
public void pleaseDraw(float[] vertices, int[] indices) {
glClearColor(0, 0, 1, 1);
glClear(GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_INT,0);
}
public void cleanUp() {
glDeleteBuffers(0);
glDeleteVertexArrays(0);
}
public FloatBuffer makeByteBufferFromArrayOfFloats(float[] vertices) {
FloatBuffer FloatByteBuffer = BufferUtils.createFloatBuffer(vertices.length);
FloatByteBuffer.put(vertices);
FloatByteBuffer.flip();
return FloatByteBuffer;
}
public IntBuffer makeByteBufferFromArrayOfInts(int[] array) {
IntBuffer IntByteBuffer = BufferUtils.createIntBuffer(array.length);
IntByteBuffer.put(array);
IntByteBuffer.flip();
return IntByteBuffer;
}
}
注意 - 此代码正在运行并输出一个蓝色窗口,中间有一个黑色四边形。 问题:
-
glBindBuffer(GL_ARRAY_BUFFER, vboID);我不清楚 GL_Array Buffer 是什么意思。据我所知,它只是向 OpenGL 当前状态显示该 VBO 将在某个时候存储数组数据。但从下面的函数我可以猜到它不仅仅是一种数据,它就像一个 数据的容器,这只是当前状态的活动。我做对了吗?还是我错过了什么? -
glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);又是这个 GL_Array_Thing。似乎这个功能将数据放入 GPU 或将当前 VBO 放入 VAO?我不确定。 -
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0,0);所以 VAO 由属性组成,在这里我们向 OpenGL 展示如何读取我们的 0 属性。如果我错了,请纠正我。 - 如果我知道 VAO 中的属性如何正常工作,我想我可以将这行
glEnableVertexAttribArray(0);和glVertexAttribPointer(0, 3, GL_FLOAT, false, 0,0);更改为glEnableVertexAttribArray(1);和glVertexAttribPointer(1, 3, GL_FLOAT, false, 0,0);。最终渲染中应该没有任何变化,但实际上黑色四边形没有出现。不知道为什么。 - 我使用索引来绘制一个四边形。但是OpenGL到底是如何理解如何读取我提供的数据的,因为我没有指定如何使用它。我只想象这条线可以帮助我做到这一点
glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_INT,0);
还有很多额外的问题,但它们要么是因为我对上面描述的问题缺乏了解而出现的。请帮助我弄清楚关于OpenGL基础知识的混乱。对于那些能够阅读甚至回答这篇文章的人 - 非常感谢!
【问题讨论】:
-
本网站最适合简短而具体的问题,每个帖子一个问题。这不是一个论坛。我建议把它分成几个帖子。另外,您是否尝试过查找它(在 OpenGL wiki 和/或手册页上)?如果您提供有关您发现的内容的详细信息以及这些内容无法回答您的问题的原因,那么人们可能更愿意帮助您。
-
这些问题针对 OpenGL 的一些基本原理。它们太宽泛了,无法在 stackoverflow 帖子中回答。已经有关于这些主题的大量文档和教程。例如,参见 buffer objects 和 Vertex Specification 上的 OpenGL wiki。还有大量的教程,如open.gl 或Learning Modern 3D Graphics Programming