如何在OpenGL ES 1.0中使用`glTexEnv`,`glColor4x`和`glBlendFunc`?

Alb*_*ore 3 android textures alphablending opengl-es

我正在看SurfaceFlinger,即在Android中进行组合的代码,我无法理解一些OpenGL ES 1.0调用,因为我只编写了ES 2.0代码.

以下是我感兴趣的代码:

glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Run Code Online (Sandbox Code Playgroud)

应该做的是将纹理混合到缓冲区中.

为什么需要glTextEnvxglColor4x电话?glBlendFunc实现混合还不够?

知道我的问题是天真的,但我仍然不明白glTexEnvx在阅读文档之后是什么.

Wro*_*lai 5

glTexEnv()设置纹理环境模式.GL_REPLACE告诉渲染器跳过当前颜色(例如,从glColor4()),然后告诉渲染器为每个相应的像素使用纹理的颜色.如果您而不是GL_REPLACE使用GL_MODULATE,那么glColor4()当渲染器设置像素的颜色时,您的调用将与纹理的颜色一起包含在内.

你的glColor4()电话不应该GL_REPLACE在你的对象上做任何事情(使用时).

关于你的glBlendFunc()论点:

GL_ONE正在使用来自传入原语的当前颜色,我们称之为.GL_ONE_MINUS_SRC_ALPHA目标(帧缓冲区中当前存储的像素)乘以(1 - 源alpha值).

通常,当您不使用纹理时,如果包含alpha值,其中1等于完全不透明且0完全透明,则可以从颜色基元获得透明效果glColor4().

  • @Albus:在这种情况下,片段实际上是帧缓冲区中已经存在的像素颜色. (2认同)
  • 好吧,当你调用`glColor4()`时,你正在为你的原语设置一个新的像素颜色,这将是*fragment*颜色(或者每个人都说的:).当我们使用`GL_MODULATE`计算混合时,`GL_BLEND`将采用纹理的颜色和像素的颜色.但是,当我们使用`GL_REPLACE`时,它基本上是在混合时删除片段颜色(例如,仅使用纹理的alpha图层来确定透明部分). (2认同)