在 OpenGL 中将粒子渲染为具有透明度的 GL_TRIANGLE_FAN

Posted

技术标签:

【中文标题】在 OpenGL 中将粒子渲染为具有透明度的 GL_TRIANGLE_FAN【英文标题】:Rendering particles as GL_TRIANGLE_FANs with transparency in OpenGL 【发布时间】:2010-12-17 20:22:56 【问题描述】:

我想渲染带有向外淡出的六边形的粒子。我为每个粒子使用了 TRIANGLE_FAN。但是,透明度看起来不是很好。

glBegin(GL_TRIANGLE_FAN);
    glColor4f(c.x, c.y, c.z, particle.temperature / 100.0);
    glVertex3f(0, 0, 0);
    glColor4f(0, 0, 0, 0);
    glVertex3f(0.866025404 * H / 2, 0.5 * H / 2, 0);
    glVertex3f(0, 1 * H / 2, 0);
    // other vertices omitted
glEnd();

我得到一个闪烁的输出,其中黑色透明部分被绘制在某些帧的不透明对象上。如何更改我的渲染例程以避免此错误?

【问题讨论】:

您的混合设置如何? glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 啊,我发现了一个Minecraft玩家(例如屏幕底部的Minecraft图标):-) 【参考方案1】:

您观察到的是其他粒子后面没有被绘制,因为 Z 缓冲区中存在更接近的 Z 值。

    你可以把你的粒子画回前面。

    您也可以禁用深度测试,但标准 Alpha 混合将不正确。使用 ALPHA/ONE 模式,您将累积所有粒子,因此顺序也不重要。

【讨论】:

以上是关于在 OpenGL 中将粒子渲染为具有透明度的 GL_TRIANGLE_FAN的主要内容,如果未能解决你的问题,请参考以下文章

如何用OpenGL ES 2.0渲染一个透明surface

OpenGL透明纹理问题

渲染具有透明度的纹理时 OpenGL 不需要的像素

透明天空盒+透明高度图的OpenGL混合问题

基于OpenGL编写一个简易的2D渲染框架-08 重构渲染器-整体架构

在opengl中将二维纹理应用于具有z方向变化的单个立方体面