OpenGL。 glEnable应该如何使texute透明并具有坚硬的像素边缘

时间:2018-10-26 16:10:03

标签: opengl 3d

给出:

我有x.png张图片,其中包含4个像素(请设为正方形)并带有色标:红色,绿色,蓝色和4号是透明的。
enter image description here

必填:

我需要找到参数glEnable()和/或glBlendFunc()的组合,这将产生以下效果:
1)应用纹理时不会出现“平滑”现象,而仅出现尖锐的像素边缘。
2)透明像素是透明的。

当前代码库:

def set_3d(self):
    ...
    glEnable(GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    glTranslatef(x, y, z)  # for getting scale image
   ...
   # + here is adding background rect(blue) and rect with 4 pixels

def add_alpha_rect(self, batch):
    ... # getting textures, etc.
    batch.add(
            4, GL_QUADS,
            texture_group,
            ('v3f', (x, y, z,
                     x_, y, z,
                     x_, y_, z
                     x, y_, z)),
            ('t3f', (0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 0.0)))

当前结果:

enter image description here

预期结果:

enter image description here

问题:

我如何获得这个结果?
有可能吗?

1 个答案:

答案 0 :(得分:3)

您必须设置纹理放大功能。放大纹理时使用此滤镜。
放大功能可以通过glTexParameteri进行设置。可能的值为GL_LINEARGL_NEAREST。初始值为GL_LINEAR

将放大倍数GL_NEAREST应用于绑定的纹理对象,以解决您的问题:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)  

请注意,虽然参数GL_LINEAR会导致返回最接近指定纹理坐标的4个纹理元素的加权平均值,而GL_NEAREST会导致最接近指定纹理纹理的值查找纹理时返回。