Артефакты в текстурировании в PyOpenGL

Я использовал Python Imaging Library загрузить .ttf шрифт. Вот код:

self.rect = Image.new("RGBA", (600,100), (255,255,255))
self.draw = ImageDraw.Draw(self.rect)
self.font = ImageFont.truetype("font.ttf", 96)
self.draw.text((5,0), "activatedgeek", (0,0,0), font=self.font)
self.texture = self.loadFont(self.rect)

Здесь loadFont() функция соответствующего класса:

def loadFont(self, im):
        try:
            ix, iy, image = im.size[0], im.size[1], im.tostring("raw", "RGBA", 0, -1)
        except SystemError:
            ix, iy, image = im.size[0], im.size[1], im.tostring("raw", "RGBX", 0, -1)

        retid = gl.glGenTextures(1)
        gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT,1)
        gl.glBindTexture(gl.GL_TEXTURE_2D,retid)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR_MIPMAP_LINEAR)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR_MIPMAP_LINEAR)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP)
        gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_GENERATE_MIPMAP, gl.GL_TRUE)
        gl.glTexImage2D(gl.GL_TEXTURE_2D,0,3,ix,iy,0,gl.GL_RGBA,gl.GL_UNSIGNED_BYTE,image)
        return retid

Вот снимок, который я сделал, используя glReadPixels() к сожалению, так же, как тот, который отображается в окне, созданном с PyQt,

Снимок OpenGL контекста

Он показывает нежелательную границу, какой-то артефакт. Пожалуйста, помогите мне исправить это.

1 ответ

Решение

Рассматривали ли вы использование более разумного состояния переноса, такого как GL_CLAMP_TO_EDGE? У меня есть сильное ощущение, что это связано с цветом границы за пределами вашего текстурного изображения.

Существует несколько подходов, которые можно использовать для решения такой проблемы, начиная с предварительно умноженной альфа-канала и заканчивая дополнительной границей текселя вокруг всего изображения, но самой простой попыткой было бы GL_CLAMP_TO_EDGE,

GL_CLAMP что-то вроде шутки в отношении режимов обтекания, он не ограничивает диапазон координат текстуры центрами текселей, и бедствие наступает, когда ближайший тексель становится цветом границы. Излишне говорить, что такое поведение обычно нежелательно.

Другие вопросы по тегам