混合多个纹理以制作粒子系统

时间:2011-01-02 16:36:27

标签: opengl graphics blending

这是交易,我想制作一个基于纹理的粒子系统,我有一个云纹理。我将纹理映射到10个不同的多边形,每个多边形具有相同的大小和纹理。 当我把它们混合在一起时,问题就会出现,而像5个多边形的像素会变得太白了!我不想要这个。我想要的是累积缓冲区的效果。我想采取这样的效果:

当Rx,Bx,Gx为仅1 多边形在页面中且像素在其中时,每个像素颜色。现在我们有n个多边形,每个都有相同的大小和纹理。

Rtotal = R1 / n + R2 / n + ... + Rn / n 同样适用于Gtotal和Btotal

我可以做些什么来从alpha混合中获得这样的结果。

BTW这里是初始化。

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST) ;
glDepthFunc(GL_ALWAYS);

glEnable(GL_NORMALIZE);
glColor4f(.5,.5, .5,.2); 
glBlendFunc (GL_SRC_ALPHA, GL_DST_ALPHA);

1 个答案:

答案 0 :(得分:1)

很难按照您的预期完成结果,因为您需要知道每个像素的 那里有多少个碎片。

如果它足以使粒子看起来不错,那么它应该足以改变混合模式。

他们正在积累白色,因为你可能正在使用加法alpha混合:

result = source_color*source_alpha + destination_color

或普通添加剂混合:

result = source_color + destination_color

(其中source是“给定片段的颜色”,目的地是“那个地方的帧缓冲区已经存在的东西”)。

这两种都有很多“层”腐烂变白。但是你可以使用“真正的”alpha混合:

result = source_color * source_alpha + destination_color * (1-source_alpha)

不会衰变为白色。

在OpenGL中,这对应于:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

这不完全是您想要的,因为结果将依赖于顺序,但对于粒子系统应该100%足够。希望有所帮助。

(另外,不要忘记在粒子前渲染实体几何体,然后禁用z-write。)