texCoordPointer不在lwjgl中工作

时间:2014-11-14 02:26:42

标签: opengl lwjgl

我在VBO中存储纹理坐标点时遇到问题,然后告诉OpenGL在渲染时使用它。在下面的代码中,我应该得到的是一个漂亮的16x16纹理在我使用四边形制作的正方形上。然而,我得到的是图像的第一个左上角像素而不是红色,所以我得到一个大的红色正方形。请详细告诉我我的错误。

  public void start() {
    try {
        Display.setDisplayMode(new DisplayMode(800,600));
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
        System.exit(0);
    }

    // init OpenGL
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, 800, 0, 600, 1, -1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);

    glLoadIdentity();

    //loadTextures();
    TextureManager.init();

    makeCube();

    // init OpenGL here

    while (!Display.isCloseRequested()) {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
        // render OpenGL here
        renderCube();

        Display.update();
    }

    Display.destroy();
}

public static void main(String[] argv) {
    Screen screen = new Screen();
    screen.start();
}

int cube;
int texture;

private void makeCube() {
    FloatBuffer cubeBuffer;
    FloatBuffer textureBuffer;

    //Tried using 0,0,16,0,16,16,0,16 for textureData did not work.
    float[] textureData = new float[]{
            0,0,
            1,0,
            1,1,
            0,1};

        textureBuffer = BufferUtils.createFloatBuffer(textureData.length);
        textureBuffer.put(texture);
        textureBuffer.flip();

        texture = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, texture);
        glBufferData(GL_ARRAY_BUFFER, textureBuffer, GL_STATIC_DRAW);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        float[] cubeData = new float[]{
            /*Front Face*/
            100,       100,
            100 + 200, 100,
            100 + 200, 100 + 200,
            100,       100 + 200};

        cubeBuffer = BufferUtils.createFloatBuffer(cubeData.length);
        cubeBuffer.put(cubeData);
        cubeBuffer.flip();

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

}

private void renderCube(){
    TextureManager.texture.bind();

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);

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

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

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glDrawArrays(GL_QUADS, 0, 4);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

1 个答案:

答案 0 :(得分:0)

我相信你的问题在于此代码片段中textureBuffer.put()的参数:

    textureBuffer = BufferUtils.createFloatBuffer(textureData.length);
    textureBuffer.put(texture);
    textureBuffer.flip();

textureint类型的变量,尚未初始化。您稍后将其用作缓冲区名称。参数应为textureData而不是:

    textureBuffer.put(textureData);

在这里回答问题时,我通常会尝试专注于功能而不是风格,但这次我无法帮助它:恕我直言,texture是缓冲区名称的一个非常不幸的名称。它不仅是一种风格和可读性问题。如果您为变量使用了描述性名称,则很可能会立即发现此问题。

假设您为缓冲区名称bufferId命名了变量(我称之为对象标识符" id",即使官方OpenGL术语是"名称"),以及缓冲区保持纹理坐标textureCoordBuf。有关的陈述将成为:

textureCoordBuf.put(bufferId);
即使是非常肤浅的代码,这也会引起高度怀疑。