这是一个两部分问题。我正在渲染一些BSP几何体,并且一些纹理具有应该是不可见的alpha颜色。
所以第一步就是找出alpha颜色,这样我才能正确渲染它。我上传了一个示例位图:
正如您所看到的,它是一种栏杆纹理,其中RGB(160,158,148)是应该不可见的颜色。我可以通过观察它来解决这个问题。问题是,如何在文件中找到此值?
这就是第一步。第二个是OpenGL问题,我用顶点数组渲染一堆几何体。我如何适应在渲染时需要从纹理中移除颜色的事实?我是否需要按特定顺序呈现此内容?此外,我应该提到我正在使用SDL,如果这有助于使这一切更容易。
谢谢你们的精彩回答。我希望我能帮你们两个......
答案 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
过滤产生奇怪的晕圈。但这已经有一段时间了,我不是百分百肯定的。