Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL ES 1.1 Android立方体映射_Android_Opengl Es - Fatal编程技术网

OpenGL ES 1.1 Android立方体映射

OpenGL ES 1.1 Android立方体映射,android,opengl-es,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

我想在不使用纹理图集的情况下得到一个简单的立方体贴图。我可以在任何给定的时间绑定一个视图来查看我的任何一个纹理,但似乎只能绑定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();

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

所以为了让它工作,你需要自己重复texCoords。请始终记住,从所有已启用阵列绘制时,至少到最后绘制的元素,所有已启用阵列的大小都必须匹配。因此,您重复使用这个小CircleExcoords阵列的想法行不通


这是因为从概念上讲,顶点不仅仅是一个位置,而是所有属性位置、法线、纹理坐标等的组合。。。。同样,顶点不仅是绑定到glVertexPointer的数组中的元素,而且是当前启用的所有数组中的元素。这也是为什么在OpenGL中,如果没有复制,就不能有一个带有两个不同texCoords的单一顶点,因为这样它就不再是单一顶点了。在OpenGL中命名位置属性顶点有点不好,尽管这更多是出于传统原因,并且在现代OpenGL中已被清理。

立方体和圆环包含什么?添加了生成这些顶点的代码。啊,找到了,我猜到了!谢谢你的回答和解释。这是非常有意义的,我验证了这些更改实际上是按预期工作的。