我希望在不使用纹理图集的情况下进行简单的立方体贴图。我可以在任何给定的时间绑定看到我的任何一个纹理,但似乎不能超过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();
答案 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中清理过。