在正方形上映射纹理(Android)

时间:2010-12-19 00:15:33

标签: android opengl-es textures vertices

我是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

2 个答案:

答案 0 :(得分:5)

您可以使用三角形风扇以更快的速度按照以下顺序绘制得更快。

01
32

然后你不需要使用drawElements或index,你只需将它提供给drawArrays并且只需要4个元素。

你的错误是,tex符号是错误的

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

所以你的紫外线是错误的。

答案 1 :(得分:-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