我有一个相当简单的问题。有两种纹理:第一种包含漫反射贴图,第二种包含透明度(使用GL_ALPHA创建)。我只需要将漫反射组件的alpha值替换为不透明度组件的alpha组件。
使用GL_BLEND和OpenGL ES 2.0非常容易:
gl_FragColor.w = texture2D(opacity_samp, tex_cord).w;
但我无法弄清楚如何使用OpenGL 1.1纹理合并器。
答案 0 :(得分:1)
最简单的方法是在CPU上组合纹理,然后将新的纹理上传回GPU。
如果您有OES_blend_func_separate和OES_framebuffer_object个附加信息,那么您可以执行以下步骤:
最后将第二个纹理(透明度)渲染为四边形覆盖整个帧缓冲区。在启用以下混合模式的情况下执行此操作:
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