在Android平台上将纹理映射到正方形

3
我是新手OpenGL,正在尝试将纹理映射到一个正方形上。我遵循了NeHe的纹理映射教程: http://insanitydesign.com/wp/wp-content/uploads/lesson06.zip。 现在我看到了我的图片...但它没有正确地映射。以下是原始图片: http://ge.tt/2FzsdIx。 这是我所看到的: http://ge.tt/6y3cdIu。 我使用了来自这个伟大的iPhone教程(下面链接)中的顶点和纹理数组,所以我希望它们已经被正确地映射。以下是Square.java代码的链接,谢谢!
public class Square {
// Our vertices.
private float vertices[] = {
          -1.0f,  1.0f, 0.0f,  // 0, Top Left
          -1.0f, -1.0f, 0.0f,  // 1, Bottom Left
           1.0f, -1.0f, 0.0f,  // 2, Bottom Right
           1.0f,  1.0f, 0.0f,  // 3, Top Right
    };

// The order we like to connect them.
private short[] indices = { 0, 1, 2, 0, 2, 3 };

// Our vertex buffer.
private FloatBuffer vertexBuffer;

// Our index buffer.
private ShortBuffer indexBuffer;


/** The buffer holding the texture coordinates */
private FloatBuffer textureBuffer;

//the texture pointer, holds the texture name which is actually a number.
private int[] textures = new int[1];

public Square() {
    // a float is 4 bytes, therefore we multiply the number if
    // vertices with 4.
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
    vbb.order(ByteOrder.nativeOrder());
    vertexBuffer = vbb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    // short is 2 bytes, therefore we multiply the number if
    // vertices with 2.
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
    ibb.order(ByteOrder.nativeOrder());
    indexBuffer = ibb.asShortBuffer();
    indexBuffer.put(indices);
    indexBuffer.position(0);

    //plot our texture
    float textCoords[]={
            //Mapping coordinates for the vertices
            0.0f, 1.0f,
            1.0f, 1.0f,
            0.0f, 0.0f,
            1.0f, 0.0f

                                };
    ByteBuffer tbb = ByteBuffer.allocateDirect(textCoords.length * 4); tbb.order(ByteOrder.nativeOrder());
    textureBuffer = tbb.asFloatBuffer(); textureBuffer.put(textCoords);
    textureBuffer.position(0);

}

//load our texture(s)
static void loadTexture(GL10 gl, Context context, int resource) {
    Bitmap bmp = BitmapFactory.decodeResource(context.getResources(),resource);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D,
    GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterx(GL10.GL_TEXTURE_2D,
    GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    bmp.recycle();      
}


/**
 * This function draws our square on screen.
 * @param gl
 */
public void draw(GL10 gl) {
    //use our textures
    gl.glEnable(GL10.GL_TEXTURE_2D); // workaround bug 3623
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    // Counter-clockwise winding.
    gl.glFrontFace(GL10.GL_CCW); // OpenGL docs
    // Enable face culling.
    gl.glEnable(GL10.GL_CULL_FACE); // OpenGL docs
    // What faces to remove with the face culling.
    gl.glCullFace(GL10.GL_BACK); // OpenGL docs

    // Enabled the vertices buffer for writing and to be used during
    // rendering.
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);// OpenGL docs.
    // Specifies the location and data format of an array of vertex
    // coordinates to use when rendering.
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, // OpenGL docs
                             vertexBuffer);

    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,// OpenGL docs
              GL10.GL_UNSIGNED_SHORT, indexBuffer);

    // Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); // OpenGL docs
    // Disable face culling.
    gl.glDisable(GL10.GL_CULL_FACE); // OpenGL docs

    }

}

iPhone教程:http://www.iphonemobilephones.com/opengl-es-from-the-ground-up-part-6-textures-and-texture-mapping.html

本文介绍了如何在OpenGL ES中使用纹理和纹理映射。涵盖了从创建位图到将其与几何形状结合的过程。此外,还讨论了使用纹理时需要考虑的一些性能问题。
2个回答

5

使用三角扇形可以更快地绘制图形,按照以下顺序在索引中进行操作,速度更快。

01
32

那么你不需要使用drawElements或indices,只需将其提供给drawArrays,并且只需要4个元素。

你的bug在于纹理坐标是错误的。

tl is 0,0
bl is 0,1
br is 1,1
tr is 1,0

您有

        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f

所以,您的UV是错误的。

-2

通常在OpenGL中渲染一个正方形看起来像这样

gl.glLoadIdentity();
gl.glBindTexture(GL.GL_TEXTURE_2D,0);
gl.glBegin(GL_QUADS)
   glVertex(x,y,z);
   glTexcoord2f(s,t);
   glVertex(-x,y,z);
   glTexcoord2f(-s,t);
   glVertex(-x,-y,z);
   glTexcoord2f(-s,-t);
   glVertex(x,-y,z);
   glTexcoord2f(s,-t);
gl.glEnd();

我没有看到类似的东西,但是我以前从未在Android上完成过GLES编程,所以可能太老了。

查看 https://github.com/ChrisLundquist/Asteroids/blob/master/src/ScenePanel.java#L277


3
在Android中没有glBegin、glVertex或其他类似的函数,你需要使用顶点缓冲区。 - HaMMeReD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接