opengl-es - OpenGL,GL_MODULATE和多重纹理

标签 opengl-es texturing multitexturing

我已经成功绘制了多纹理多边形,但是不幸的是,整个纹理区域仅使用了覆盖纹理的第一个像素。

以下是纹理(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

编辑:
从红皮书:

If you are multitexturing and you use glTexCoord*(), you are setting the texture coordinates for the first texture unit. In other words, using glTexCoord*() is equivalent to using glMultiTexCoord* (GL_TEXTURE0,...)



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

最佳答案

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

  • 在glTexCoordPointer
  • 之前,将glClientActiveTexture(GL_TEXTURE *)用作0和1
  • 对每个纹理也使用glEnableClientState(GL_TEXTURE_COORD_ARRAY)以及
  • 还原回glClientActiveTexture(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);
    

    结果是:

    关于opengl-es - OpenGL,GL_MODULATE和多重纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9116494/

    相关文章:

    c - 使用 glTexGen 在 OpenGL 中对球体进行纹理化

    OpenGL - 纹理图集 "smudging"

    OpenGL 3.3 多纹理 : GL_TEXTURE1 and following are always black (Only GL_TEXTURE0 works fine)

    ios - 具有不同 uv 坐标的 OpenGL ES 1 多纹理

    ios - 周围没有任何东西的纹理

    ios - 带有旋转表面的 OpenGL ES 2.0 工件

    java - 我可以在哪里更改着色器制服并调用 GL 函数?

    android - 打开 GLES 或 Canvas ? (安卓)

    c++ - OpenGL 3.2 纹理问题