0

新しい VBO を作成し、代わりにオフセットを使用して作成したキューブで埋めるコードがいくつかありますglTranslate。オフセットを使用して新しいキューブを作成する cubeVBO クラスがありますが、何らかの理由でコードが 1 回しか呼び出されません。また、目の前にいると立方体の面が消えるため、カリングが正しく機能していないようです。クラスは次のとおりです。

public class CubeVBO {

public int vboVHandle;
int offset = Block.size;
int count = 0;
public FloatBuffer vertices;

public CubeVBO(float x, float z, float y){
    vertices = BufferUtils.createFloatBuffer(3 * 4 * 6);
    vertices.put(new float[] {
            x + offset, y + offset, z, 
            x - offset, y + offset, z,
            x - offset, y + offset, z - Block.size, 
            x + offset, y + offset, z - Block.size, 
            x + offset, y - offset, z - Block.size, 
            x - offset, y - offset, z - Block.size, 
            x - offset, y - offset, z, 
            x + offset, y - offset, z, 
            x + offset, y + offset, z - Block.size, 
            x - offset, y + offset, z - Block.size, 
            x - offset, y - offset, z - Block.size, 
            x + offset, y - offset, z - Block.size, 
            x + offset, y - offset, z, 
            x - offset, y - offset, z, 
            x - offset, y + offset, z, 
            x + offset, y + offset, z, 
            x - offset, y + offset, z - Block.size, 
            x - offset, y + offset, z, 
            x - offset, y - offset, z, 
            x - offset, y - offset, z - Block.size, 
            x + offset, y + offset, z, 
            x + offset, y + offset, z - Block.size, 
            x + offset, y - offset,
            z - Block.size, x + offset, y - offset, z });
    vertices.flip();

    vboVHandle = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboVHandle);
    glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

そして、私はこのクラスでそれを使用します:

public class BaseChunk {

// x - left/right y - up/down y - forward/backward

VBO vbo;
CubeVBO vertexVBO;

public static final int CHUNK_X = 16;
public static final int CHUNK_Y = 16;
public static final int CHUNK_Z = 16;

public boolean rebuild = false;

FloatBuffer blockPositionData;
FloatBuffer vertexColorData;

private Block[][][] blocks;
private int vboBlockData;

public BaseChunk() {

    blocks = new Block[CHUNK_X][CHUNK_Z][CHUNK_Y];
    blockPositionData = BufferUtils.createFloatBuffer((CHUNK_X * CHUNK_Z * CHUNK_Y) * 6 * 12);

    for (int xx = 0; xx < CHUNK_X; xx++) {
        for (int zz = 0; zz < CHUNK_Z; zz++) {
            for (int yy = 0; yy < CHUNK_Y; yy++) {
                blocks[xx][zz][yy] = Block.Grass;
            }
        }
    }
}

public void rebuildChunk(int id) {
    if (rebuild) {

    }
}

public void makeChunk(){
    for(int x = 0; x <= 16; x++){
        for(int z = 0; z <= 16; z++){
            for(int y = 0; y <= 16; y++){
                vertexVBO = new CubeVBO((float) 16 + x, (float) 16 + z, (float) 16 + y);
            }
        }
    }

    vboBlockData = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboBlockData);
    glBufferData(GL_ARRAY_BUFFER, blockPositionData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

public void render() {
    vbo = new VBO();
    glBindBuffer(GL_ARRAY_BUFFER, vertexVBO.vboVHandle);
    glVertexPointer(3, GL_FLOAT, 0, 0L);

    glBindBuffer(GL_ARRAY_BUFFER, vbo.vboCHandle);
    glColorPointer(3, GL_FLOAT, 0, 0);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
                glPushMatrix();
                //glTranslatef(0, 0, 0);
                glDrawArrays(GL_QUADS, 0, 24);
                glPopMatrix();
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
}

私のオフセットは間違っていますか?または、私の VBO コードが間違っていますか?

4

1 に答える 1

0

あなたの問題の 1 つは、makeChunk() で多数の CubeVBO を作成しているが、それらをすべて同じ変数に割り当てているため、メソッドが終了すると、最後に作成したものだけが vertexVBO によって参照されることだと思います。render() では、最終的な CubeVBO をバインドして描画しています。

すべての立方体の頂点を含む 1 つの大きな VBO を作成し、それをバインドして描画する必要があります。glDrawArrays の count パラメータを更新することを忘れないでください。

于 2013-03-03T06:42:39.040 に答える