Opengl es OpenGL、GL_调制和多文本

Opengl es OpenGL、GL_调制和多文本,opengl-es,texturing,multitexturing,Opengl Es,Texturing,Multitexturing,我已经成功地绘制了一个多纹理多边形,但不幸的是,整个纹理区域只使用了叠加纹理的第一个像素 以下是纹理(GL_纹理0和GL_纹理1): 结果是: 仅使用顶部的红色像素。我试过在顶部加一个1x1的蓝色像素,我用蓝色叠加得到了同样的结果 我的代码: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisableClientState(GL_COLOR_ARRAY); const CGPoint ve

我已经成功地绘制了一个多纹理多边形,但不幸的是,整个纹理区域只使用了叠加纹理的第一个像素

以下是纹理(GL_纹理0和GL_纹理1):

结果是:

仅使用顶部的红色像素。我试过在顶部加一个1x1的蓝色像素,我用蓝色叠加得到了同样的结果

我的代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisableClientState(GL_COLOR_ARRAY);

const CGPoint vertices[] = {
    ccp(0,0),
    ccp(100,0),
    ccp(0,100),
    ccp(100,100),
};

// This will flip the image for us as well
const CGPoint coordinates[] = {
    ccp(0,1),
    ccp(1,1),
    ccp(0,0),
    ccp(1,0),
};

// Config multitextures
glClientActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, icon.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glEnable(GL_TEXTURE_2D);

glClientActiveTexture(GL_TEXTURE1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, overlay.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glEnable(GL_TEXTURE_2D);

GLubyte points = 4;

// Draw the square
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, points);

// Revert back
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

// glClientActiveTexture(GL_TEXTURE0); // breaks multitexturing
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glEnableClientState(GL_COLOR_ARRAY);
这是一个OpenGL问题,但iOS项目可供感兴趣的人使用:

编辑: 红皮书:

如果您是多文本处理,并且使用glTexCoord*(),则需要设置 第一个纹理单元的纹理坐标。换句话说,, 使用glTexCoord*()相当于使用glTexCoord* (GL_纹理0,…)


有关于如何传递坐标数组的提示吗?OpenGL ES 1.1不支持glBegin()等。

最后!解决办法是我必须做三件事:

  • 在glTexCoordPointer之前,对0和1使用GLClientActivateTexture(GL_纹理*)
  • 对每个纹理也使用glEnableClientState(GL_纹理_坐标_数组)
  • 恢复为GLClientActivateTexture(GL_TEXTURE0),以避免与进一步绘制冲突
以下是有效的代码:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisableClientState(GL_COLOR_ARRAY);

const CGPoint vertices[] = {
    ccp(0,0),
    ccp(100,0),
    ccp(0,100),
    ccp(100,100),
};

// This will flip the image for us as well
const CGPoint coordinates[] = {
    ccp(0,1),
    ccp(1,1),
    ccp(0,0),
    ccp(1,0),
};

// Config multitextures
glClientActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, icon.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glEnable(GL_TEXTURE_2D);

glClientActiveTexture(GL_TEXTURE1);
glActiveTexture(GL_TEXTURE1);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D, overlay.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glEnable(GL_TEXTURE_2D);

GLubyte points = 4;

// Draw the square
glVertexPointer(2, GL_FLOAT, 0, vertices);
glDrawArrays(GL_TRIANGLE_STRIP, 0, points);

// Revert back
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);

glClientActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);

glEnableClientState(GL_COLOR_ARRAY);
结果是:


看来你在找。太棒了!工作,除了设置
glClientActiveTexture(GL_TEXTURE0)在绘图后导致再次失败。我有其他的绘制方法,我需要恢复状态。如何实现这一点?我也查看了
glvertexattributepointer
,但我不知道如何使用它来指定GL_纹理1的坐标……我已经更新了我的代码,非常感谢您的帮助!