【问题标题】:OpenGL. What should take glEnable for make texute transparent and with hard pixel edgesOpenGL。 glEnable 应该采取什么措施使纹理透明并具有硬像素边缘
【发布时间】:2018-10-27 00:27:31
【问题描述】:

给定:

我有 x.png 图像,其中包含 4 个像素(让它为正方形),颜色为:红色、绿色、蓝色和 4-th 是透明的。

必填:

我需要找到glEnable() 和/或glBlendFunc() 的参数组合,这将产生以下效果:
1)纹理应用没有“平滑”,只是锐利的像素边缘。
2) Transtarent 像素是透明的。

当前代码库:

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)))

当前结果:

预期结果:

问题:

我怎样才能达到这个结果?
有可能吗?

【问题讨论】:

    标签: opengl 3d


    【解决方案1】:

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

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

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)  
    

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

    【讨论】:

    • 我把glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) 放在glBlendFunc 之后,没有任何改变。也许我在错误的地方打电话给glTexParameteri
    • @YuriyLeonov 你必须在glBindTexture之后做。
    • @YuriyLeonov 不客气。注意,如果纹理被缩小,那么有一个缩小功能GL_TEXTURE_MIN_FILTER
    猜你喜欢
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多