0

OpenGL で世界を即時モードでレンダリングした後、VBO の学習を開始しました。私が指定しなかったと確信しているこれらのランダムな頂点が世界中に散らばっていることを除いて、すべてがうまく機能します。ただし、UV 座標を 1 から .5 に変更すると、作成される形状が小さくなります。UV 座標を何度も確認しましたが、問題はないようです。私が言ったように、私は VBO を使用するのはちょっと初心者なので、これらの形状を私の世界から取り除くための助けをいただければ幸いです。これが私のソースコードです(テクスチャのss = S座標開始およびse = S座標終了):

public class MyProject {

int width=1,depth=1,height=1,w=854,h=480;
float size= .50f;
Camera cam = new Camera();
Block[][][] blocks = new Block[height][width][depth]; 
int textureId,vboHandle,vtoHandle;
FloatBuffer vbo,vto;

public static void main(String[] args){
    MyProject mp = new MyProject();
    mp.start();
}

public void start(){
    initDisplay();
    initGL();
    initWorld();
    run();
}

public void initWorld(){
    for(int x = 0; x<blocks[0].length;x++){
        for(int y = 0; y<blocks.length;y++){
            for(int z = 0; z<blocks[0][0].length;z++){
                blocks[y][x][z] = new Block(x,y,z);
                blocks[y][x][z].rendertype=GL11.GL_QUADS;
            }
        }
    }
}

public void initDisplay(){
    try {
        boolean set=false;
        DisplayMode[] displays = Display.getAvailableDisplayModes();
        for(int i=0;i<displays.length;i++){
            DisplayMode d = displays[i];
            if(d.getWidth()==w&&d.getHeight()==h){
                Display.setDisplayMode(d);
                set=true;
                break;
            }
        }
        if(!set)Display.setDisplayMode(new DisplayMode(w,h));
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }
}

public void initGL(){
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glEnable(GL11.GL_CULL_FACE);
    GL11.glShadeModel(GL11.GL_SMOOTH);
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    GL11.glClearDepth(1.0);
    GL11.glEnable(GL11.GL_DEPTH_TEST);
    GL11.glDepthFunc(GL11.GL_LEQUAL);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();

    GLU.gluPerspective(45.0f, (float)w/(float)h, .001f, 100f);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    textureId = Texture.loadTexture(Texture.loadImage("/imgs/texture.png"));
    vboHandle = GL15.glGenBuffers();
    vtoHandle = GL15.glGenBuffers();

}

public void run(){
    while(!Display.isCloseRequested()){
        Input.tick();
        cam.tick();
        render();
        Display.update();
        Display.sync(60);
    }
    Display.destroy();
    GL15.glDeleteBuffers(vboHandle);
    GL15.glDeleteBuffers(vtoHandle);
    GL11.glDeleteTextures(textureId);
}

public Block getBlock(int x, int y, int z){
    if(x<0||x>=width-1||y<0||y>=height-1||z<0||z>=depth-1){
        return null;
    }
    else return blocks[y][x][z];
}

public boolean checkSurroundings(int x, int y, int z){
    if(getBlock(x,y-1,z)!=null&&getBlock(x,y+1,z)!=null&&
            getBlock(x,y,z-1)!=null&&getBlock(x,y,z+1)!=null&&
                    getBlock(x-1,y,z)!=null&&getBlock(x+1,y,z)!=null){
        return true;
    }
    return false;
}

public void render(){
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glLoadIdentity();
    GL11.glRotatef(cam.pitchrot, 1, 0, 0);
    GL11.glRotatef(cam.yawrot, 0, 1, 0);
    GL11.glRotatef(cam.rollrot, 0, 0, 1);
    GL11.glTranslatef(cam.x, cam.y, cam.z);
    GL11.glColor3f(1.0f, 1.0f, 1.0f);
    vbo = BufferUtils.createFloatBuffer(width*height*depth*24*3);
    vto = BufferUtils.createFloatBuffer(width*height*depth*24*2);
    for(int x = 0; x<blocks[0].length;x++){
        for(int y = 0; y<blocks.length;y++){
            for(int z = 0; z<blocks[0][0].length;z++){
                Block b = blocks[y][x][z];
                if(b!=null)
                    renderCubeVBO(b);
            }
        }
    }
    vbo.flip();
    vto.flip();

    glBindBuffer(GL_ARRAY_BUFFER, vboHandle);
    glBufferData(GL_ARRAY_BUFFER, vbo, GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, 0L);
    glBindBuffer(GL_ARRAY_BUFFER, vtoHandle);
    glBufferData(GL_ARRAY_BUFFER, vto, GL_STATIC_DRAW);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);

    glDrawArrays(GL_QUADS, 0, width*height*depth*24*3);
}

public void renderCubeVBO(Block b){
    vbo.put(new float[]{
        //top
        b.x+size, b.y+size, b.z-size,
        b.x-size, b.y+size, b.z-size,
        b.x-size, b.y+size, b.z+size,
        b.x+size, b.y+size, b.z+size,
        //bottom
        b.x+size,b.y-size, b.z+size,
        b.x-size,b.y-size, b.z+size,
        b.x-size,b.y-size, b.z-size,
        b.x+size,b.y-size, b.z-size,
        //front
        b.x+size, b.y+size, b.z+size,
        b.x-size, b.y+size, b.z+size,
        b.x-size, b.y-size, b.z+size,
        b.x+size, b.y-size, b.z+size,
        //back
        b.x-size, b.y +size, b.z-size,
        b.x+size, b.y +size, b.z-size,
        b.x+size, b.y-size, b.z-size,
        b.x-size, b.y-size, b.z-size,
        //left
        b.x-size, b.y+size, b.z+size,
        b.x-size, b.y+size, b.z-size,
        b.x-size,b.y-size, b.z-size,
        b.x-size,b.y-size, b.z+size,
        //right
        b.x+size, b.y+size, b.z-size,
        b.x+size, b.y+size, b.z +size,
        b.x+size, b.y-size, b.z+size,
        b.x+size, b.y-size, b.z-size,
    });

    vto.put(new float[]{
        //top
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
        //bottom
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
        //front
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
        //back
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
        //left
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
        //right
        b.se, b.ts, b.ss, b.ts, b.ss, b.te, b.se, b.te,
    });
}

}

ここに私が話していることのいくつかのスクリーンショットがあります: http://imgur.com/a/YQ9NU

4

1 に答える 1

2

glDrawArrays は、アタッチされたバッファーのサイズではなく、レンダリングする頂点の数を取ります。そこにはいくつかのマジック ナンバーがある24 * 3ので ( )、それを混同している可能性があります。

于 2013-08-20T14:59:04.453 に答える