VBO中的LWJGL纹理

时间:2014-01-07 19:03:07

标签: java opengl 3d lwjgl

好吧,我使用VBO创建了一个简单的3D立方体,我想在其上加载纹理。唯一的问题是纹理都搞砸了,这是我的代码:

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

private void makeCube(float x, float y, float z) {
    int cube = glGenBuffers();
    int texture = glGenBuffers();
    FloatBuffer cubeBuffer;
    FloatBuffer textureBuffer;

    float highX = x + tileSize;
    float highY = y + tileSize;
    float highZ = z + tileSize;

    float[] textureData = new float[]{
        0,0,
        1,0,
        1,1,
        0,1
    };

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

    float[] cubeData = new float[]{
        /*Front Face*/
        x, y, z,
        highX, y, z,
        highX, highY, z,
        x, highY, z,
        /*Back Face*/
        x, y, highZ,
        highX, y, highZ,
        highX, highY, highZ,
        x, highY, highZ,
        /*Left Face*/
        x, y, z,
        x, y, highZ,
        x, highY, highZ,
        x, highY, z,
        /*Right Face*/
        highX, y, z,
        highX, y, highZ,
        highX, highY, highZ,
        highX, highY, z,
        /*Bottom Face*/
        x, y, z,
        x, y, highZ,
        highX, y, highZ,
        highX, y, z,
        /*Top Face*/
        x, highY, z,
        x, highY, highZ,
        highX, highY, highZ,
        highX, highY, z,};

    cubeBuffer = asFloatBuffer(cubeData);

    glBindBuffer(GL_ARRAY_BUFFER, cube);
    glBufferData(GL_ARRAY_BUFFER, cubeBuffer, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindBuffer(GL_ARRAY_BUFFER, cube);

}

private void renderCube() {
    textures.get(0).bind();
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0);
    glTexCoordPointer(2, GL_FLOAT, 0, 0);
    glDrawArrays(GL_QUADS, 0, 22);
    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(0, 0, -1);

}

VBO Textures 我认为这是唯一错误的是我的纹理坐标数组,如果是这样,任何人都可以给我一个正确的顺序吗?

是的,我翻转我的缓冲区,是的,我的图像是2的幂。

1 个答案:

答案 0 :(得分:0)

renderCube (...)的实施有问题:

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

  /* These two pointers reference the same memory! */
  glVertexPointer(3, GL_FLOAT, 0, 0);
  glTexCoordPointer(2, GL_FLOAT, 0, 0);

  glDrawArrays(GL_QUADS, 0, 22);
  glDisableClientState(GL_VERTEX_ARRAY);
  glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

您需要做的是在调用glVertexPointer(3, GL_FLOAT, 0, 0)之前立即将VBO绑定到顶点位置,并在调用glTexCoordPointer(2, GL_FLOAT, 0, 0)之前立即将纹理坐标的VBO绑定到。{/ p>

这些函数建立了相对于地址空间的指针,该地址空间由VBO在您调用它们时绑定的地址定义(如果您不使用VBO,则为实际的系统内存指针)。

/* Setup Position Pointer */
glBindBuffer    (GL_ARRAY_BUFFER, cube);
glVertexPointer (3, GL_FLOAT, 0, 0);

/* Setup Texture Coordinate Pointer */
glBindBuffer      (GL_ARRAY_BUFFER, texture);
glTexCoordPointer (2, GL_FLOAT, 0, 0);
相关问题