我想获得一个不使用纹理图集的简单多维数据集映射。我可以在任何给定的时间绑定任何我的纹理,但似乎做不到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();

最佳答案

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

因此,为了使其正常工作,您需要自己重复texCoords。始终牢记,从它们进行绘制时,所有启用的数组的大小都必须匹配(至少直到最后绘制的元素)。因此,重用此小型circleTexCoords数组的想法将行不通。

这是因为从概念上讲,顶点不仅是位置,而且是所有属性(位置,法线,texCoords等)的组合。同样,顶点不仅是绑定到glVertexPointer的数组中的元素,而且是所有当前启用的数组中的元素。这也是为什么在OpenGL中没有复制时就无法拥有具有两个不同texCoords的单个顶点的原因,因为好吧,那么它将不再是单个顶点。在OpenGL中命名位置属性顶点是一个不好的选择,尽管这更多是出于遗留原因,并且在现代OpenGL中已被清除。

10-06 06:25