渲染几何中的alpha透明度并在位图中计算出alpha颜色 - OpenGL

时间:2011-11-02 21:32:04

标签: opengl sdl render bmp

这是一个两部分问题。我正在渲染一些BSP几何体,并且一些纹理具有应该是不可见的alpha颜色。

所以第一步就是找出alpha颜色,这样我才能正确渲染它。我上传了一个示例位图:

Image

正如您所看到的,它是一种栏杆纹理,其中RGB(160,158,148)是应该不可见的颜色。我可以通过观察它来解决这个问题。问题是,如何在文件中找到此值?

这就是第一步。第二个是OpenGL问题,我用顶点数组渲染一堆几何体。我如何适应在渲染时需要从纹理中移除颜色的事实?我是否需要按特定顺序呈现此内容?此外,我应该提到我正在使用SDL,如果这有助于使这一切更容易。

谢谢你们的精彩回答。我希望我能帮你们两个......

2 个答案:

答案 0 :(得分:3)

  

并且一些纹理具有应该不可见的alpha颜色。

这实际上称为键控颜色

Alpha通道是一个额外的通道,添加到“普通”RGB通道。使用Alpha混合时,使用alpha通道值作为不透明度。

  

我可以通过观察来解决这个问题。问题是,如何在文件中找到这个值?

如果使用了颜色键,则使用某种特定颜色,用于所有图像,或分别存储键控值,将其与图像文件一起加载。另一种常见技术是使用左上角像素的值作为键控颜色。

  

我如何适应在渲染时需要从纹理中移除颜色的事实?

通过使用颜色键生成alpha通道准备图像数据:

for(i = 0; i < pixelcount; i++) {
    if( source[i].r == key.r && source[i].g == key.g && source[i].b == key.b ) {
        dest[i].r = dest[i].g = dest[i].b = dest[i].a = 0;
        continue;
    }
    dest[i].r = source[i].r;
    dest[i].g = source[i].g;
    dest[i].b = source[i].b;
    dest[i].a = 255;
}

更新在使用颜色键生成的Alpha通道的情况下,可以使用 alpha测试而不是混合。 alpha测试的好处是,它不需要在绘制之前对几何体进行深度排序。

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5);

理想的方法是使用支持alpha通道的图像文件格式(PNG,TGA,OpenEXR,...),而不使用BMP(实际上BMP文件格式允许第4个通道,事实上我曾经多年前我写了自己的BMP加载器,支持alpha通道和Photoshop导出插件。

答案 1 :(得分:2)

如果我想要完全透明,那么

Alpha testing是我的首选技巧。不需要分类。

只要你的图像转换为PNG并将每个RGB(160,158,148)像素的alpha设置为零,其他地方设置为255。然后你可以使用alpha测试。

您可能需要将RGB(160,158,148)像素更改为RGB(255,255,255),以避免使用GL_LINEAR过滤产生奇怪的晕圈。但这已经有一段时间了,我不是百分百肯定的。