opengl 中的透明度(使用 FLTK)
Posted
技术标签:
【中文标题】opengl 中的透明度(使用 FLTK)【英文标题】:transparency in opengl (using FLTK) 【发布时间】:2014-03-17 14:33:10 【问题描述】:我在 FLTK 的 opengl 实现中的 Fl_Gl_Window 中绘制了一些 3D 结构。这些图像被绘制和旋转,所以代码看起来像
glTranslatef(-xshift,-yshift,-zshift);
glRotatef(ang1,ang2,ang3);
glTranslatef(xshift,yshift,zshift);
glColor4f((120.0/256.0),(120.0/256.0),(120.0/256.0),0.2);
for (int side=0;side<num_sides;side++)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable( GL_BLEND );
glBegin(GL_TRIANGLES);
//draw shape
glEnd();
glDisable(GL_BLEND);
它几乎可以在不同的角度工作,透明度不能正常工作。例如,如果我从一侧画一个立方体,它会一直看起来是透明的,无法辨别两侧,但从另一侧看,它会看起来更暗。就好像它在旋转之前计算透明度太“早”。难道我做错了什么?我应该将旋转移动到透明效果下方(即在它们执行之前)还是三角形的顺序重要?
【问题讨论】:
【参考方案1】:三角形的顺序很重要。要获得所需的透明度效果,您需要以从后到前的顺序渲染三角形,因为硬件混合通过读取深度缓冲区中片段的颜色并将其与当前正在着色的片段混合来工作。这就是为什么在旋转立方体时会得到不同结果的原因,因为您没有更改立方体中三角形的顺序。您可能还想研究 Order Independent Transparency 技术。
根据每帧对它们进行排序的三角形数量可能会非常昂贵。一种近似技术是沿 x、y 和 z 轴对三角形进行预排序,然后选择最接近您的观察方向的排序顺序。这仅在一定程度上有效。一种流行的与顺序无关的透明度技术是深度剥离。这是一个包含一些实现代码的教程:http://mmmovania.blogspot.com/2010/11/order-independent-transparency.html?m=1。您可能还想阅读原始论文以更好地了解该技术:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.18.9286&rep=rep1&type=pdf。
【讨论】:
谢谢,有道理。这听起来也需要付出更多的努力,尤其是因为我现在必须掌握旋转对 z 轴所做的事情,或者更确切地说,“新”轴是 z 轴曾经所在的位置......然后大概在发送之前根据这个新的“轴”订购我所有的多边形边。这样做是否有危险?/这样做有什么明显的技巧吗?您所说的这些与顺序无关的技术的初学者介绍有什么好的链接吗? 我已经更新了我的答案,包括一些关于订单独立透明度的链接。 谢谢,现在明白了。我会仔细考虑我的要求将决定我做什么,但我肯定会考虑深度剥离的事情。以上是关于opengl 中的透明度(使用 FLTK)的主要内容,如果未能解决你的问题,请参考以下文章