OpenGL ES中纹理和颜色显示不正确

3
我一直在跟随http://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html上的教程学习,但遇到了一个问题。
我已经成功运行了以下两个示例:
2.7 示例5:3D形状-旋转彩色立方体和金字塔(Nehe Lesson 5: 3D Shapes) 示例2:Cube2.java
2.8 示例6:纹理(Nehe Lesson 6: Texture)
但当我尝试绘制彩色立方体和带纹理的立方体时,出现了以下问题: 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:照片立方体”部分。

(只能发布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个回答

3
您的问题非常详细,这很好,但如果您发布完整的代码示例,将会更有帮助。我很难猜测您可能会做什么导致问题。
无论如何,我将尝试回答您的两个问题:
第一个:我猜测您在绘制彩色立方体之前没有禁用纹理。但是由于没有全部代码,不能确定。在渲染第二个立方体之前调用 glDisable(GL_TEXTURE_2D),并在绘制下一个纹理立方体之前重新启用它。
第二个:不,那是正确的方式(虽然您可能想使用 1,1,1,1 而不是 1,1,1,0,以防您将来需要处理透明度)。或者还有一种方法,通过将颜色状态推入 OpenGL 栈并稍后将其弹出,但这已经过时,不应使用。

非常感谢!问题确实是glDisable引起的。我的代码与教程中的绘制函数几乎完全相同,所以我没有费心去发布它,但下次我会这样做!使用glColor来重置颜色似乎有点奇怪,但如果这是正确的方法,那么也没什么可做的了! - Kirken
谢谢,我一直在寻找清除颜色的方法,你的1,1,1,1的方法非常有效。 - twig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接