【问题标题】:how draw object with diffuse texture after multi-textured object如何在多纹理对象后绘制具有漫反射纹理的对象
【发布时间】:2011-11-08 10:44:36
【问题描述】:

我正在使用多重纹理绘制一个对象。这很好,但是当我仅使用漫反射纹理绘制其他对象时,该漫反射纹理会与先前的纹理绑定。我知道我必须停用默认以外的纹理单元,并且必须在 GL_TEXTURE0 处创建活动纹理单元,但它不起作用。

这是我的代码

glClientActiveTexture(GL_TEXTURE0); // first texture
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, stride, texCoordOffset);
glClientActiveTexture(GL_TEXTURE1); // second texture
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, stride, texCoordLightOffset);

// Enable 2D texturing for the first texture.
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

// Enable 2D texturing for the second texture.
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);

// We are trying for the multi-textured lighting effect from the OpenGL
// ES 2.0 book, page  223, Figure 10-3. The relevant shader equation is
// basecolor * (lightcolor + 0.25), so we set the constant as a base colour
glColor4f(0.25f, 0.25f, 0.25f, 1.0f);


// Set the light map has the current texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,m_new_tex);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT,5.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

// add the light map to the constant 0.25
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PREVIOUS);

// Now set the background map (bricks) and modulate (multiply)
glActiveTexture(GL_TEXTURE1);
// we'll keep this code here as _texSelection will never be our lightmap
glBindTexture(GL_TEXTURE_2D, m_sky);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 5.0f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

/* Set the texture environment mode for this texture to combine */
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

/* Set the method we're going to combine the two textures by. */
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

/* Use the previous combine texture as source 0*/
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);

/* Use the current texture as source 1 */
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);

/*
 Set what we will operate on, in this case we are going to use
 just the texture colours.
 */
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);


glBindBuffer(GL_ARRAY_BUFFER, drawable.VertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, drawable.IndexBuffer);

glDrawElements(GL_TRIANGLES, drawable.IndexCount, GL_UNSIGNED_SHORT, 0);

glDisable(GL_TEXTURE_2D);

对于简单的漫反射纹理,在绑定纹理之前我必须编写哪些命令?

任何其他示例代码都会有所帮助。

【问题讨论】:

  • 这么多纹理似乎有效?顺便说一句,glTexParameter改变的状态是per-texture状态,而不是per-unit状态,所以不需要每帧都改变,只需要在创建纹理之后就可以了。

标签: iphone ios ipad opengl-es multitexturing


【解决方案1】:

首先,您必须为每个未使用的纹理单元禁用纹理 (glDisable(GL_TEXTURE_2D)),您已经在执行此操作。当然,您还必须为未使用的纹理单元禁用纹理坐标数组,因此在第二个纹理单元处于活动状态时(在调用 glClientActiveTexture(GL_TEXTURE1) 之后)调用 glDisableClientState(GL_TEXTURE_COORD_ARRAY)

当您完成多重纹理处理后,您当然必须调用glActiveTexture(GL_TEXTURE0)glClientActiveTexture(GL_TEXTURE0)。否则所有以下纹理操作都适用于纹理单元 1 而不是 0。

但是所有这些事情已经在我对你其他问题的回答中说明了。你读过吗?

编辑:顺便说一句,glTexParameter 更改的状态是按纹理对象存储的,而不是按单元存储的。所以你不需要每帧调用这些,创建纹理后一次就足够了。

【讨论】:

  • @rocksvick 如果答案是您问题的解决方案,我们将不胜感激。还是我误解了您的评论而您自己解决了(尽管我怀疑该解决方案与我的解决方案有很大不同)?
  • 感谢您的回答,是的,在您的回答到来之前问题就解决了……顺便谢谢。
  • 其他对象正在完美渲染,但是当我尝试最终渲染一个使用混合的对象(对象是透明的树)时,它们不会保持透明,而是纹理单元 0 的纹理正在出现那些对象..你能提出一些解决方案吗?
  • @rocksvick 很难回答。但作为一般规则,始终在渲染之前设置您需要的每个状态,并在渲染后恢复它。 OpenGL 是一个状态机,每个状态都保持其值,直到再次更改它。当然,它也不知道渲染帧是什么,并且会跨帧保持其状态。
  • 感谢您的回复。我有一个疑问。我在多重纹理处理期间使用了 glTexEnv。当我完成多重纹理处理后,在禁用纹理单元 1 并激活纹理单元 0 后,我们需要重置 glTexEnv 吗?如果是的话怎么做?
猜你喜欢
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
相关资源
最近更新 更多