如何绘制纹理并使用VBO?

时间:2014-04-01 15:51:31

标签: java opengl graphics 3d lwjgl

目前我有一个VBO的工作系统,我有两个缓冲区 - 一个用于位置,一个用于颜色。但是,我想绘制纹理而不是颜色。如何在VBO位置缓冲区上绘制纹理?这是在Java和LWJGL中,但任何语言的示例都有帮助。

2 个答案:

答案 0 :(得分:2)

  

我想为我的VBO添加纹理。我该怎么做呢?

你没有。至少你没有将纹理图像添加到VBO中。你添加的是一个新属性,称为纹理坐标,它为每个顶点指定纹理图像的位置。

纹理本身是一个独立的对象,使用glGenTexturesglBindTextureglTexImage…创建。

答案 1 :(得分:0)

这是一个简单的代码片段,用于初始化和渲染带纹理的多维数据集。使用Slick2D库。

int vertexHandle;
int textureHandle;

private void init() throws IOException {
    Camera.init();
    texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("test.png"));
    this.initialize3D();
    vertexHandle = GL15.glGenBuffers();
    FloatBuffer positionData = BufferUtils.createFloatBuffer(72);
    // Initalize position data.
    positionData.flip();

    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,vertexHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER,positionData,GL15.GL_STATIC_DRAW);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER,0);

    FloatBuffer textureData = BufferUtils.createFloatBuffer(72);
    // Initialize texture data.
    textureBuffer.flip();

    textureHandle = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, textureHandle);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, textureData, GL15.GL_STATIC_DRAW);
    GL11.glTexCoordPointer(3, GL11.GL_FLOAT, 0, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
}

public void render() {
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    GL11.glLoadIdentity();
    texture.bind();
    GL11.glPushMatrix();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexHandle);
    GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, textureHandle);
    GL11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0L);
    GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);
    GL11.glPopMatrix();
}

此外,您可能需要集成此方法的一部分来初始化3D渲染:

public void initialize3D() {
    GL11.glEnable(GL11.GL_TEXTURE_2D); // Allows 2D textures.
    GL11.glShadeModel(GL11.GL_SMOOTH); // Smoother textures.
    //GL11.glClearColor(0.4f,0.6f,1.0f,0.0f); // BG color. 6698FF
    GL11.glClearDepth(1.0); // Buffer depth, allows objects to draw over things behind them.
    GL11.glEnable(GL11.GL_DEPTH_TEST); // Depth testing (see above).
    GL11.glDepthFunc(GL11.GL_LEQUAL); // Type of depth testing.

    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    //GL11.glEnableClientState(GL11.GL_COLOR_ARRAY);
    GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);

    GL11.glMatrixMode(GL11.GL_PROJECTION); // Sets matrix mode to displaying pixels.
    GL11.glLoadIdentity(); // Loads the above matrix mode.

    // Sets default perspective location.                       Render Distances: Min   Max
    GLU.gluPerspective(45.0f,(float)Display.getWidth()/(float)Display.getHeight(),0.1f,300.0f);

    GL11.glMatrixMode(GL11.GL_MODELVIEW); // Sets the matrix to displaying objects.
    GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT,GL11.GL_NICEST); // Something unimportant for quality.
}