2014-01-08 1 views
1

그래서이 작업을 수행하는 방법을 알아 냈습니다. 내 배열은 겉보기에 엉망입니다. 설명하기 어려우므로 사진과 코드를 제공하십시오.하나의 VBO에 여러 개의 큐브가 있습니다.

EDIT : 문제는 피 루프 및 X1, Y1, Z1 변수는 3x3x1 어레이 수율이 결과를 만들기 플로트

public void create() { 
    setup(); 
    render(); 
} 

private void makeCube() { 
    texture = glGenBuffers(); 
    cube = glGenBuffers(); 

    FloatBuffer cubeBuffer; 
    FloatBuffer textureBuffer; 

    ArrayList<Float> cubeList = new ArrayList<>(); 
    ArrayList<Float> textureList = new ArrayList<>(); 

    float[] cubeFloat; 
    float[] textureFloat; 

    for (float x1 = 0; x1 < tileSize * width; x1 += tileSize) { 
     for (float y1 = 0; y1 < tileSize * height; y1 += tileSize) { 
      for (float z1 = -tileSize * depth; z1 < 0; z1 += tileSize) { 
       float highX = x1 + tileSize; 
       float highY = y1 + tileSize; 
       float highZ = z1 + tileSize; 

       float[] cubeData = new float[]{ 
        /*Front Face*/ 
        x1, y1, z1, 
        highX, y1, z1, 
        highX, highY, z1, 
        x1, highY, z1, 
        /*Back Face*/ 
        x1, y1, highZ, 
        highX, y1, highZ, 
        highX, highY, highZ, 
        x1, highY, highZ, 
        /*Left Face*/ 
        x1, y1, z1, 
        x1, y1, highZ, 
        x1, highY, highZ, 
        x1, highY, z1, 
        /*Right Face*/ 
        highX, y1, z1, 
        highX, y1, highZ, 
        highX, highY, highZ, 
        highX, highY, z1, 
        /*Bottom Face*/ 
        x1, y1, z1, 
        x1, y1, highZ, 
        highX, y1, highZ, 
        highX, y1, z1, 
        /*Top Face*/ 
        x1, highY, z1, 
        x1, highY, highZ, 
        highX, highY, highZ, 
        highX, highY, z1}; 

       for (float f : cubeData) { 
        cubeList.add(f); 
       } 
      } 
     } 
    } 

    cubeFloat = compileFloat(cubeList); 

    for (int i = 0; i < (width * height * depth); i++) { 
     float[] textureData = new float[]{ 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1, 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1, 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1, 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1, 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1, 
      0, 0, 
      1, 0, 
      1, 1, 
      0, 1}; 

     for (Float f : textureData) { 
      textureList.add(f); 
     } 
    } 

    textureFloat = compileFloat(textureList); 

    textureBuffer = asFloatBuffer(textureFloat); 
    glBindBuffer(GL_ARRAY_BUFFER, texture); 
    glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    cubeBuffer = asFloatBuffer(cubeFloat); 
    glBindBuffer(GL_ARRAY_BUFFER, cube); 
    glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_DYNAMIC_DRAW); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

private float[] compileFloat(ArrayList<Float> list) { 
    float[] f = new float[list.size()]; 

    for (int i = 0; i < list.size(); i++) { 
     f[i] = list.get(i); 
    } 

    return f; 
} 

private void renderCube() { 
    textures.get(0).bind(); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, cube); 
    glVertexPointer(3, GL_FLOAT, 0, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, texture); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0); 

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

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
} 

private void render() { 
    while (!Display.isCloseRequested()) { 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     glLoadIdentity(); 
     camera(); 

     renderCube(); 

     Display.update(); 
     Display.sync(30); 
    } 

    Display.destroy(); 
    System.exit(0); 
} 

private void setup() { 
    try { 
     Display.setDisplayMode(new DisplayMode(frameWidth, frameHeight)); 
     Display.setTitle("3D Project"); 
     Display.setVSyncEnabled(vSync); 
     Display.create(); 
    } catch (LWJGLException ex) { 
     Logger.getLogger(Camera.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(fov, (float) Display.getWidth()/(float) Display.getHeight(), zNear, zFar); 
    //glOrtho(0, Display.getWidth(), Display.getHeight(), 0, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 

    glLoadIdentity(); 

    loadTextures(); 

    makeCube(); 

} 

의해 제어되는 하였다

3x3x1

비록 2x2x1 배열을 만드는 것은 완벽하게 작동합니다. 2x2x1

이것이 내가 잘못 생각한 것입니다. 어떻게 수정해야할지 모르겠습니다. (이것은. Problem

+0

우선, 2x2x1 배열이 완벽하게 잘 맞으면 참조 용 스크린 샷을 포함시켜야합니다. 그렇지 않으면 실제로 포함 된 다이어그램에서 잘못된 점을 설명하지 않은 것입니다. 둘째, [마지막 질문 (이 질문과 관련있는)] (http://stackoverflow.com/questions/20979673/lwjgl-textures-in-vbo)이 해결되었지만 답변을 수락하지 않았습니다. ... 당신은 그 대답을 받아 들여야하고 *** 다음에 *** 당신의 새로운 질문을하거나이 질문을 편집하여이 새로운 정보를 포함하고 이것을 삭제해야합니다. –

+0

죄송합니다. 답변을 수락하고 2x2x1 배열의 스크린 샷을 업로드합니다. – zfollette

+0

이와 같은 부동 소수점 변수로 제어되는 루프는 매우 드문 경우입니다. 너비 나 높이가 부동 소수점이라면 값에 따라 실제로 이상한 일이 발생할 수 있습니다. 어떤 경우에는, 정육면체의 개수가 정사각형을 형성하는 것이 정확하다는 것을 알 수 있습니다 : 3 ** 2 = 9, 5 ** 2 = 25. 그러나 이들이 정사각형이되기를 원합니다. 그래서 각 열은 1이 너무 많습니다 (홀수 차원의 경우). 솔직히, 내가 할 첫 번째 일은이 이상한 부동 소수점 루프 제어 논리를 제거하는 것입니다. –

답변

2

tileSize 사용되는 값을 설명하기 해 주셔서 감사합니다. 5x5x1로 0.1 어떤 정밀도 부동 소수점으로 표현 될 수 값을 추정는베이스 (2)에 반복 비율로 퇴화시켰다 모든 사람들이 10 분의 1로하는 1/3에 익숙해 있습니다. 정확히 0.1이 아닌 숫자를 계속 추가하면 결과는 예상과 다를 수 있습니다.

일반적으로 루프 제어에서는 부동 소수점 표현식을 사용하지 않는 것이 가장 좋습니다. 컴파일러가 행복하게 accept 0.1과 같은 부동 소수점 상수는 모두 정확하고 그 숫자를 정확하게 나타낼 수 있지만 부동 소수점 수학의 메커니즘을 이해하지 못하면이 같은 이상한 일이 발생할 수 있습니다.

궁금한 점이 있으시면 제가 언급 한 문제에 대한 자세한 설명은 here입니다.

관련 문제