代码之家  ›  专栏  ›  技术社区  ›  sharvey

使用纹理中的alpha绘制纯色

  •  8
  • sharvey  · 技术社区  · 14 年前

    如何使用OpenGLES 1.1(iPhone)绘制纹理,但只使用alpha绘制一些颜色?

    结果应该是与原始纹理完全相同的alpha蒙版,内部只有一个纯色,而不是原始颜色。

    我在用 glDrawArrays 具有 glCoordPointer glVertexPointer .

    我想做两个步骤,一个是纹理,一个是纯色。我只是好像找不到 glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA); .

    编辑:再看一看,我认为这应该可以实现使用 glTexEnvf . 只是找到正确的论据而已。

    3 回复  |  直到 14 年前
        1
  •  8
  •   Ozirus    14 年前

    如前所述,glTexEnv是一条路要走。

    要替换纹理的RGB组件并保持其alpha不变,可以尝试以下操作(此代码使用红色作为替换颜色):

    glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
    
    glActiveTexture( GL_TEXTURE_0 );
    glEnable( GL_TEXTURE_2D );
    glBindTexture(GL_TEXTURE_2D, spriteTexture);
    
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
    
    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
    
    // ... draw as usual
    

    下面是一些解释。

    使用GL_COMBINE时,可以完全控制如何将不同纹理阶段的输入/输出组合在一起。在本例中,我们指定要将(GL_replace)纹理阶段0的RGB组件替换为来自上一个阶段(GL_previous)的组件,在本例中,该阶段是单一颜色(用glColor4f设置)。

    我们没有为alpha组件设置任何特殊的内容,因为我们需要常规的行为。 添加以下行的效果与未包含行的效果相同(默认行为):

    glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
    glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);   
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
    glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);
    
        2
  •  2
  •   benzado    14 年前

    如果可以使用OpenGL ES 2.0,可以使用自定义片段明暗器来完成此操作。如果您使用的框架是基于1.1构建的,或者针对的是不支持2.0的设备,这不会有太大帮助。但如果可以的话,你可以这样做:

    uniform lowp sampler2D sampler; // which texture unit to use
    uniform lowp vec4 solidColor;
    
    varying highp vec2 fragmentTexCoord;
    
    void main()
    {
        // Get the color with an alpha of zero
        vec4 color = vec4(1,1,1,0) * solidColor;
        // Get the alpha from the texture, zero the r,g,b components
        vec4 alpha = vec4(0,0,0,1) * texture2D(sampler, fragmentTexCoord);
        // their sum is the solid color with the alpha mask of the texture
        gl_FragColor = color + alpha;
    }
    

    如果你能确保solidColor的alpha为零,你可以跳过乘法步骤。

        3
  •  0
  •   MSN    14 年前

    glBlendFunc(source_factor, dest_factor) 翻译成:

    dest= source*source_factor + dest*dest_factor
    

    所以 glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA) 是:

    dest= source*0 + dest*(1 - source.alpha)
    

    第二遍(不是相反的)应该是 glBlendFunc(GL_SRC_ALPHA, GL_ONE) :

    dest= source*source.alpha + dest
    

    因为你已经在第一个过程中应用了alpha蒙版。尽管您仍然需要了解如何使用alpha而不是源纹理应用恒定颜色。