【问题标题】:Blending multiple textures to make a particle system混合多个纹理以制作粒子系统
【发布时间】:2011-06-02 12:49:20
【问题描述】:

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

【问题讨论】:

  • 你忘了告诉你的目标 OpenGL 版本。
  • 您可以使用着色器执行两遍解决方案,您可以在第一遍中计算每个片段中的粒子数。然后你可以按照你描述的方式进行划分。
  • 听起来很酷的答案 :D 但对我来说很难,因为我是着色器的新手。

标签: opengl graphics blending


【解决方案1】:

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

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

它们正在累积为白色,因为您可能正在使用加法 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。)

【讨论】:

  • 当我按照你说的做时,多边形不会相互混合!也许我应该发布代码。请告诉我你是否有时间略读。
  • 我也没有得到最后几行。你能解释一下吗
  • 你记得做 glEnable(GL_BLEND) 吗?您也可以发布代码的相关部分,如果您愿意,也可以发布来自 GLintercept 的帧日志。
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多