纹理和颜色在OpenGL ES中无法正确显示

时间:2012-05-15 14:36:26

标签: android opengl-es colors textures

我一直在http://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html处理过教程,但我遇到了问题。

我设法让以下两个例子都有效:

2.7示例5:3D形状 - 旋转颜色立方体和金字塔(第5课:3D形状) 示例2:Cube2.java

2.8示例6:纹理(第6课:纹理)

但是当我尝试绘制彩色立方体和纹理立方体时,我得到以下结果:

http://i.imgur.com/Smbsa.png (图像的第一部分)

彩色立方体是不可见的,但会剪切纹理立方体,纹理立方体的纹理会被彩色立方体的最后一种颜色(黄色)着色。

我基本上只用以下方法绘制两个立方体:

  // ----- Render the Color Cube -----
  gl.glLoadIdentity();                // Reset the model-view matrix
  gl.glTranslatef(0.0f, 0.0f, -6.0f); // Translate right and into the screen
  gl.glScalef(0.5f, 0.5f, 0.5f);      // Scale down (NEW)
  gl.glRotatef(angleCube, 1.0f, 1.0f, 0.0f); // rotate about the axis (1,1,1) (NEW)
  cube.draw(gl);                      // Draw the cube (NEW)

  // Update the rotational angle after each refresh (NEW)
  angleCube += speedCube;         // (NEW)

  // ----- Render the Texture Cube -----
  gl.glLoadIdentity();                // Reset the model-view matrix
  gl.glTranslatef(-1.0f, 0.0f, -6.0f); // Translate right and into the screen
  gl.glScalef(0.5f, 0.5f, 0.5f);      // Scale down (NEW)
  gl.glRotatef(angleCube, 1.0f, 1.0f, 0.0f); // rotate about the axis (1,1,1) (NEW)
  texturecube.draw(gl);                      // Draw the cube (NEW)

我尝试从“ 2.9示例6a:Photo-Cube ”部分添加第三个所谓的“Photo cube”。

(只能发布2个链接检查上面的imgur链接)

我补充说:

 gl.glColor4f(0.0f, 0.0f, 1.0f, 1.0f);

到纹理立方体并注意到蓝色“溢出”到照片立方体。

当我添加:

 gl.glColor4f(1.0f, 1.0f, 1.0f, 0.0f);

以下纹理不再是彩色的,但这感觉就像删除过去的颜色一样粗糙。

当我删除时:

  texturecube.loadTexture(gl, context);    // Load image into Texture (NEW)
  photocube.loadTexture(gl);    // Load image into Texture (NEW)
  gl.glEnable(GL10.GL_TEXTURE_2D);  // Enable texture (NEW)

这种情况发生了:

(只能发布2个链接检查上面的imgur链接)

颜色立方体返回,所有其他表面都是彩色的。

我的问题:

彩色立方体消失后,我做错了什么? (我想应该可以同时使用纹理和颜色)

除了“gl.glColor4f(1.0f,1.0f,1.0f,0.0f)”之外,是否有更好的方法来“清除”之前的立方体/物体的颜色;“?

1 个答案:

答案 0 :(得分:3)

您的问题非常详细,但是如果您发布了绘图部分的完整代码示例,则会有所帮助。我很难猜出你可能会做什么导致问题。

无论如何,我会尝试你的两个问题:

首先:我的猜测是你在绘制彩色立方体之前不要禁用纹理。但是你没有完整的代码,所以我不能肯定地说。在渲染第二个立方体之前调用glDisable(GL_TEXTURE_2D),然后在绘制下一个纹理立方体之前重新启用它。

第二:不,这是正确的方法(尽管你可能想要1,1,1,1,而不是1,1,1,0,以防你想要透明度做任何事情)。或者,有一种方法可以通过将颜色状态推送到OpenGL堆栈并稍后弹出它来实现,尽管这已被弃用且不应使用。