这是交易,我想制作一个基于纹理的粒子系统,我有一个云纹理。我将纹理映射到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);
答案 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。)