3

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

我已经设法使以下两个示例都起作用:

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

2.8 示例 6:纹理(Nehe 第 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 ”部分添加第三个所谓的“照片立方体”。

(只能发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);”之外,有没有更好的方法从以前的立方体/对象中“清除”颜色?

4

1 回答 1

3

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

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

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

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

于 2012-05-15T17:01:16.830 回答