1

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

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

Rtotal = R1/n+R2/n+...+Rn/n Gtotal 和 Btotal 相同

我该怎么做才能从 alpha 混合中获得这样的结果。

顺便说一句,这里是初始化。

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);
4

1 回答 1

2

很难使结果完全符合您的要求,因为您需要知道每个像素有多少片段。

如果你可以让粒子看起来不错,那么改变混合模式就足够了。

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

result = source_color*source_alpha + destination_color

或普通的添加剂混合:

result = source_color + destination_color

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

两者都衰减为带有很多“层”的白色。但是你可以使用“真正的”阿尔法混合:

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

它不会腐烂成白色。

在 OpenGL 中,这对应于:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

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

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

于 2011-01-02T17:31:47.363 回答