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

标签 android opengl-es colors textures

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

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

2.7 示例 5:3D 形状 - 旋转颜色立方体和金字塔(Nehe 第 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:照片立方体”部分添加第三个所谓的“照片立方体”。

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

最佳答案

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

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

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

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

关于android - 纹理和颜色在 OpenGL ES 中显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10603071/

相关文章:

java - 在 Activity 中添加 Mobfox 横幅广告代码

android - getActionBar().setTitle() 寻找什么 id?

javascript - WebGL 的绘图原语是什么?

android - 何时在 Android 游戏的方法中同步方法或使用同步块(synchronized block)?

iphone - 如何从我的 EAGLLayer 抓取图像?

android - 在 Fragment 中滚动不适用于 TabLayout

android - 使用 mvvp 结构中的数据绑定(bind)导航到另一个 Activity

python - matplotlib 中具有 N 个不同颜色阴影的条形图

javascript - 图表JS。更改轴线颜色

Android 分隔线颜色 DatePicker 对话框