OpenGL ES 1.1 Android Cubemapping

时间:2011-12-25 05:04:09

标签: android opengl-es

我希望在不使用纹理图集的情况下进行简单的立方体贴图。我可以在任何给定的时间绑定看到我的任何一个纹理,但似乎不能超过1,更不用说6.下面是我的绘图循环中的代码。

    /*Cube to draw */
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cube);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[2]);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, circleTexCoords);     
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[3]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[4]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[5]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextures[6]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
    gl.glBindTexture(GL10.GL_TEXTURE_2D,mTextures[7]);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);

我错过了一些基本的东西吗?

我做过检查的事情: 是的,我生成了一个纹理缓冲区。 是的,我从我的资源中正确加载和绑定纹理。 是的,上面的代码工作时,而不是绑定纹理我用glColorf

绘制它

感谢您的帮助。

编辑:

我是如何生成立方体的:

private float box[] = new float[] {
        // FRONT
        -0.5f, -0.5f,  0.5f,
         0.5f, -0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        // BACK
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
         0.5f, -0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        // LEFT
        -0.5f, -0.5f,  0.5f,
        -0.5f,  0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,
        -0.5f,  0.5f, -0.5f,
        // RIGHT
         0.5f, -0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
        // TOP
        -0.5f,  0.5f,  0.5f,
         0.5f,  0.5f,  0.5f,
         -0.5f,  0.5f, -0.5f,
         0.5f,  0.5f, -0.5f,
        // BOTTOM
        -0.5f, -0.5f,  0.5f,
        -0.5f, -0.5f, -0.5f,
         0.5f, -0.5f,  0.5f,
         0.5f, -0.5f, -0.5f,
};

 /* Initialize values for cube */
 ByteBuffer bb = ByteBuffer.allocateDirect(Float.SIZE * box.length);
 bb.order(ByteOrder.nativeOrder());
 cube = bb.asFloatBuffer();
 cube.put(box);
 cube.rewind();

CircleTexCoords是用词不当,我用它作为几种不同纹理的单位纹理坐标:

 bb = ByteBuffer.allocateDirect(Float.SIZE * 8);
 bb.order(ByteOrder.nativeOrder());
 circleTexCoords = bb.asFloatBuffer();
 circleTexCoords.put( new float[] { 0f, 1f, 1f, 1f, 0f, 0f, 1f, 0f});
 circleTexCoords.rewind();

1 个答案:

答案 0 :(得分:1)

您的顶点数组不匹配。从当前启用的属性数组绘制时,在您的情况下使用顶点和tecCoords,数组必须匹配大小。当你调用glDrawArrays(..., 8, 4)时,你指示OpenGL从第8个元素开始绘制4个数组元素(顶点)。但是你的texCoord数组只包含4个顶点,顶点4-23的texCoords应该在你的顶点数组中是什么?或者OpenGL如何知道你想要为每4个连续顶点重复texCoords。

因此,为了使其工作,您需要自己重复texCoords。请记住,所有启用的数组的大小在从它们绘制时必须匹配(至少到最后绘制的元素)。因此,重新使用这个小circleTexCoords数组的想法是行不通的。

这是因为从概念上讲,顶点不仅仅是一个位置,而是所有属性(位置,法线,texCoords,......)的加法。同样,顶点不仅是绑定到glVertexPointer的数组中的元素,而且来自所有当前启用的数组。这也是为什么你不能在OpenGL中有两个不同的texCoords而没有重复的单个顶点的原因,因为那样它就不再是一个单独的顶点了。在OpenGL中命名位置属性 vertex 是一个不错的选择,尽管这更多是出于遗留原因并且已经在现代OpenGL中清理过。