gpt4 book ai didi

java - 使用单个 VBO 创建体素 block - 如何平移每个 block 的坐标并将其添加到 VBO block ?

转载 作者:行者123 更新时间:2023-12-01 12:51:52 29 4
gpt4 key购买 nike

我正在尝试制作一个类似于《我的世界》的 opengl 体素引擎。

我创建了一个 block 类,我想将整个 block 的所有顶点放入单个 VBO 中。我之前只是将每个 block 放入 vbo 中并调用来渲染每个 block 。

当我将所有顶点放入一个 vbo 中时,我对如何转换 block 中每个 block 的坐标感到有点困惑。

这就是我现在所拥有的:

public void drawChunk() {
GL11.glPushMatrix();
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOVertexHandle);
GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOTextureHandle);
GL11.glColorPointer(3, GL11.GL_FLOAT, 0, 0L);


GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);
GL11.glPopMatrix();
}

public void putVertices(float tx, float ty, float tz) {
float l_length = 1.0f;
float l_height = 1.0f;
float l_width = 1.0f;
vertexPositionData.put(new float[]{
xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz,
xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,

xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
xOffset + -l_length + tx, -l_height + ty, zOffset + l_width + tz,
xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,

xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,
xOffset + -l_length + tx, l_height + ty,zOffset + l_width + tz,
xOffset + -l_length + tx, -l_height + ty,zOffset + l_width + tz,
xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,

xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz,
xOffset + -l_length + tx, -l_height + ty,zOffset + -l_width + tz,
xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
xOffset + l_length + tx, l_height + ty, zOffset + -l_width + tz,

xOffset + -l_length + tx, l_height + ty, zOffset + l_width + tz,
xOffset + -l_length + tx, l_height + ty, zOffset + -l_width + tz,
xOffset + -l_length + tx, -l_height + ty, zOffset + -l_width + tz,
xOffset + -l_length + tx, -l_height + ty,zOffset + l_width + tz,

xOffset + l_length + tx, l_height + ty,zOffset + -l_width + tz,
xOffset + l_length + tx, l_height + ty, zOffset + l_width + tz,
xOffset + l_length + tx, -l_height + ty, zOffset + l_width + tz,
xOffset + l_length + tx, -l_height + ty, zOffset + -l_width + tz

});
}

public void createChunk() {
vertexPositionData = BufferUtils.createFloatBuffer((24*3)*activateBlocks);

Random random = new Random();
for (int x = 0; x < CHUNK_SIZE; x++) {
for (int y = 0; y < CHUNK_SIZE; y++) {
for (int z = 0; z < CHUNK_SIZE; z++) {
if(blocks[x][y][z].getActive()) {
putVertices(x, y, z);
}
}
}
}

vertexPositionData.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);


float[] cubeColorArray = new float[(24*3)*activateBlocks];
for(int i=0; i<(24*3)*activateBlocks; i++) {
cubeColorArray[i] = random.nextFloat();
}
FloatBuffer vertexTextureData = BufferUtils.createFloatBuffer((24*3)*activateBlocks);
vertexTextureData.put(cubeColorArray);
vertexTextureData.flip();

GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOTextureHandle);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexTextureData,
GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

glEnd();
}

有什么简单的方法可以将每个 block 的顶点转换到正确的位置?我以前在每次调用渲染 block 时都使用 glTranslatef 但现在不起作用。我现在所做的也不起作用,所有 block 都在彼此之上的堆栈中渲染,看起来像这样:

编辑:看来我的 vbo 只渲染一个 block ,而不是整个 block 。我不明白为什么会出现这种情况。

http://i.imgur.com/NyFtBTI.png

最佳答案

我已经解决了这个问题。问题出在我的drawChunk 方法中。

        GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);

更改为:

        GL11.glDrawArrays(GL11.GL_QUADS, 0, 24*activateBlocks);

关于java - 使用单个 VBO 创建体素 block - 如何平移每个 block 的坐标并将其添加到 VBO block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24168847/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com