OpenGL ES 1.1 - 结合不透明度和漫反射贴图

时间:2012-01-30 05:04:47

标签: iphone opengl-es

我有一个相当简单的问题。有两种纹理:第一种包含漫反射贴图,第二种包含透明度(使用GL_ALPHA创建)。我只需要将漫反射组件的alpha值替换为不透明度组件的alpha组件。

使用GL_BLEND和OpenGL ES 2.0非常容易:

gl_FragColor.w = texture2D(opacity_samp, tex_cord).w;

但我无法弄清楚如何使用OpenGL 1.1纹理合并器。

2 个答案:

答案 0 :(得分:1)

最简单的方法是在CPU上组合纹理,然后将新的纹理上传回GPU。

如果您有OES_blend_func_separateOES_framebuffer_object个附加信息,那么您可以执行以下步骤:

  1. 创建framebuffer。
  2. 为其添加新纹理 - 这将包含两个组合纹理。
  3. 通过渲染四边形覆盖整个帧缓冲区来绘制漫反射贴图。
  4. 最后将第二个纹理(透明度)渲染为四边形覆盖整个帧缓冲区。在启用以下混合模式的情况下执行此操作:

    glEnable(GL_BLEND);
    glBlendFuncSeparateOES(GL_ZERO, GL_ONE, GL_ONE, GL_ZERO);
    

答案 1 :(得分:1)

纹理合并器会帮助你。如果漫反射贴图具有1.0 alpha值且不透明度贴图具有白色,则使用此方法:

//Multiply textureID0 with textureID1

glActiveTexture(GL_TEXTURE0);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textureID0);
 //Simply sample the texture
 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
 //------------------------
 glActiveTexture(GL_TEXTURE1);
 glEnable(GL_TEXTURE_2D);
 glBindTexture(GL_TEXTURE_2D, textureID1);
 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
 //Sample RGB, multiply by previous texunit result
 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);   //Modulate RGB with RGB
 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS);
 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
 //Sample ALPHA, multiply by previous texunit result
 glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);  //Modulate ALPHA with ALPHA
 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS);
 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE);
 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
 glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

否则您可以调整组合设置:设置GL_REPLACE而不是GL_MODULATE。其他信息请访问:http://www.opengl.org/wiki/Texture_Combiners

相关问题