OpenGL ES 1.1:如何在不失去亮度的情况下改变纹理颜色?

Ten*_*r04 5 iphone android opengl-es

我有粒子,我希望能够改变代码的颜色,所以可以使用任何颜色.所以我只有一个基本上具有亮度的纹理.

我一直在用glColor4f(1f, 0f, 0f, 1f);这种颜色.

我尝试过的每一个blendfunc都接近工作,就像下面的最后一张图片一样.我仍然希望保留亮度,就像在中间的图片中一样.(如果颜色图层位于纹理图层的顶部,则类似于Photoshop中的叠加或柔光滤镜.)

没有可编程着色器的任何想法如何做到这一点?此外,由于这些是粒子,我不想在它后面有一个黑盒子,我想把它添加到场景中.

替代文字

Ozi*_*rus 9

这是一个可能接近您正在寻找的解决方案:

glColor4f(1.0f, 0.0f, 0.0f, 1.0f);

glActiveTexture( GL_TEXTURE0 );
glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, spriteTexture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

glActiveTexture( GL_TEXTURE1 );
glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, spriteTexture);    
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD );
Run Code Online (Sandbox Code Playgroud)

它的作用是将原始纹理乘以指定的颜色,然后在顶部添加原始纹理的像素值:

final_color.rgba = original_color.rgba * color.rgba + original_color.rgba;
Run Code Online (Sandbox Code Playgroud)

这将产生比您要求的更明亮的图像,但通过一些调整可能足够好.

如果要保留纹理的alpha值,则需要使用GL_COMBINE而不是GL_ADD(+正确设置GL_COMBINE_RGB和GL_COMBINE_ALPHA).

以下是在纹理上使用此技术的一些结果. 替代文字