将每个像素乘以其Alpha Open GLES 1.1(预乘)&然后逆转

时间:2013-03-06 19:07:51

标签: opengl-es pixel-shader opengl-es-1.1 premultiplied-alpha

我正在研究GLES 1.1中的项目。它必须是GLES 1.1。

但它必须做一些预乘,即得到每个像素,并从rgba = r * a,b * a,g * a,a改变它。然后反过来。

如果我可以访问着色器,那将是没有问题,但当然是gles 1.1我没有。

通过读取像素进行操作,然后在CPU上进行并将其放回原点非常慢,所以我想到某些事情我可以作弊。

现在我可以通过glTexEnvi

来实现预乘的一种方式
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE1);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA);

但之后,我需要撤销操作。对于我的生活,我想不出一种扭转它的方法。

如果一切都有相同的alpha我可以滥用glLighting功能但遗憾的是他们没有。

我感觉我有点注定了。

也许我可以使用共享上下文并做一个GLES 2.0的片段......但我觉得这会带来自己的开销

如果有人对此有任何想法或想法,我将非常感谢听到他们!

1 个答案:

答案 0 :(得分:0)

无法自己或在这里找到答案。对于任何想知道的人来说已经有一段时间了......

最后,我设法说服了那些能够成为"的力量。让我将项目转换为GLES 2.0。这个过程实际上并不痛苦(幸运的是),这非常值得。

上述操作已成功卸载到GPU以及其他一些操作,性能从1fps增加到60 + ......非常值得:)。

值得注意的是,如果重写不是一种选择,我的混合方法本来是值得的