我已经成功地绘制了一个多纹理多边形,但不幸的是,覆盖纹理的第一个像素正在整个纹理区域使用。
以下是纹理(GL_TEXTURE0和GL_TEXTURE1):


其结果是:

只使用顶部的红色像素。我尝试了一个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项目在这里可供感兴趣的人使用:http://dl.dropbox.com/u/33811812/cocos2d/OpenGLTest.zip
编辑:红皮书中的:
--如果您正在进行多纹理处理,并且使用glTexCoord*(),则需要为第一个纹理单元设置纹理坐标。换句话说,使用glTexCoord*()等于使用glMultiTexCoord* (GL_TEXTURE0,.)
有任何关于如何传递坐标数组的提示吗?OpenGL ES1.1不支持glBegin()等。
发布于 2012-02-03 04:32:33
终于来了!解决办法是我必须做三件事:
发生冲突。
下面是工作的代码:
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);其结果是:

https://stackoverflow.com/questions/9116494
复制相似问题