我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。
游戏循环如下所示,相机调用glTranslate和glRotate函数。
game.clearScreen();
Camera.update(delta);
try {
game.render();
} catch (IOException e) {
System.out.println(e);
}
Display.update();
Display.sync(FRAME_RATE);
渲染方法:
world.render(vertices,colorVertices);
FloatBuffer VertexPositionData = BufferUtils.createFloatBuffer(vertices.size());
float[] floats = new float[vertices.size()];
int i = 0;
for (Float f : vertices) {
floats[i] = Float.intBitsToFloat(Float.floatToIntBits(f));
i++;
}
VertexPositionData.put(floats);
VertexPositionData.flip();
FloatBuffer VertexColorData = BufferUtils.createFloatBuffer(colorVertices.size());
float[] colorFloats = new float[colorVertices.size()];
int j = 0;
for (Float f : colorVertices) {
colorFloats[j] = Float.intBitsToFloat(Float.floatToIntBits(f));
j++;
}
VertexColorData.put(colorFloats);
VertexColorData.flip();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,VBOVertexHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER,VertexPositionData,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,VBOColorHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER,VertexColorData,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0);
GL11.glPushMatrix();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOColorHandle);
GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L);
GL11.glDrawArrays(GL11.GL_QUADS, 0, vertices.size()/3);
GL11.glPopMatrix();
阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。
渲染之前,需要调用glEnableClientState(GL\U顶点\U数组)
和glEnableClientState(GL\U颜色\U数组)
。还应在渲染后禁用它们。
此外,当前正在每个渲染过程中重新创建VBO,这通常不是一个好主意。如果要渲染静态场景,只需创建一次,如果需要更新场景,则应使用glBufferSubData
或glMapBuffer
仅更新需要更改的部分,以及Gl_STREAM_DRAW
而不是Gl_static_DRAW
作为使用提示。
还有,我不知道你为什么要使用Float。intBitsToFloat(Float.floatToIntBits(f))
或创建浮点数组。
我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU
我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null
我正在努力学习LWJGL (OpenGL)不得不说我很艰难。 我试着在窗户上画一个三角形和一个四边形,最后我设法做到了。 但我还有一个问题 如果您觉得这个问题很愚蠢,请提前表示歉意,但我在网上找不到非常详细的教程,所以很难理解,因为这是我第一次使用OpenGL。 话虽如此,这是代码的相关部分: 假设程序以60 fps的速度运行。< br >这意味着渲染方法每秒钟被游戏循环调用60次。 该渲染方法的
下面的lwjgl3代码设置缓冲区等,用于呈现三角形。我能看到三角形。现在我正努力弄明白到底是怎么回事。 下面是我对代码的理解。我们首先创建一个顶点缓冲区对象,它只是一个数组的容器。glBindBuffer()和glBufferData()使用顶点数组填充顶点缓冲区对象。我们再次对第二个顶点数组执行此操作。然后我们编译顶点和片段着色器,并将它们添加到着色器程序中。不知怎么的,这个程序访问第二个顶点缓
我正在使用区块系统(如Minecraft)制作一个小体素引擎。我决定每个区块制作一个VBO,这样VBO就包含了多个使用不同纹理的立方体。 实际上,我有一个立方体的UV,我想在VBO中的所有立方体上使用它,因此如果立方体在分离的VBO中,纹理将以相同的方式包裹所有立方体。 以下是我实际得到的信息: 如何告诉OpenGL在所有多维数据集上执行与第一个多维数据集相同的操作? 编辑:这里是我的着色器:顶点
null null null 在原始OpenGL中这样做虽然简单,但如果为单个缓冲区设置了许多属性,就会失去控制。我想我可以简化调用属性函数的过程,使用具有如下API的可变模板: 然而,这是不可行的,因为模板参数(AFAIK)实际上不是可变的,而是只能使参数可变。我不想使用函数参数的原因是,我希望能够输入C++关键字和,它们不能用作参数。我目前的解决方案是将参数与重复基本类型的枚举一起使用,例如和