在8位位图中处理alpha通道的好方法? - OpenGL - C++

Fla*_*njd 1 c++ opengl alpha-transparency

我正在使用OpenGL加载位图来纹理3d网格.其中一些位图具有某些像素的alpha通道(透明度),我需要找出最佳方法

  1. 获得每个像素的透明度值

  1. 应用透明度渲染它们

有没有人有这方面的好例子?OpenGL支持这个吗?

geo*_*tnz 5

首先,通常最好将位图数据转换为32位,以便每个通道(R,G,B,A)获得8位.上传纹理时,请指定32位格式.

然后在渲染时,您需要glEnable(GL_BLEND);并设置混合函数,例如:glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);.这告诉OpenGL使用纹理的alpha将纹理的RGB与背景的RGB混合.

如果您对3D对象执行此操作,您可能还需要关闭背面剔除(以便通过前面看到对象的背面)并将三角形从后向前排序(以便混合发生以正确的顺序).

如果源位图是8位(即:使用指定为透明度蒙版的一种颜色的调色板),则将其转换为RGBA可能最容易,当颜色与透明度蒙版匹配时,将alpha值设置为0.

一些提示使事情(也许)看起来更好:

  • 你的alpha通道将是一个全有或全无的事件(0x00或0xff),所以应用一些模糊算法来获得更柔和的边缘,如果这就是你所追求的.
  • 对于alpha为零(完全透明)的纹素(纹理像素),将RGB颜色替换为最接近的非透明纹理.当插入纹理坐标时,它们不会与BMP中的原始透明度颜色混合.

  • @Flarmar他并不一定意味着你必须转换文件.如果无法转换文件,则应在加载时转换数据. (4认同)