2013-10-30 48 views
1

我已使用Python Imaging Library加载.ttf字体。下面是代码:PyOpenGL纹理中的人工制品

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创建的窗口上同一拍摄的快照。

Snapshot OpenGL context

它显示了不必要的边界,一些人工制品。请帮我纠正这一点。

+0

您是否尝试过创建没有mipmap的纹理? –

回答

1

您是否考虑过使用更合理的换行状态,例如GL_CLAMP_TO_EDGE?我有一种强烈的感觉,认为这与纹理图像边缘以外的边框颜色有关。

您可以采取多种方法来解决此类问题,范围从预乘alpha到整个图像周围的额外纹理边界,但最简单的尝试是GL_CLAMP_TO_EDGE

GL_CLAMP就包装模式而言只是一个笑话,它不会将纹理坐标的范围限制到纹理中心,并且当最近的纹理元素变为边界颜色时会发生灾难。不用说,这种行为通常是不可取的。

+0

我会试试这个谢谢你!虽然奇怪的是我在Windows 8上测试了相同的代码,但给了我期望的结果,但在Ubuntu 13.10中,它表现不佳。 – activatedgeek

+0

是的,它确实工作谢谢! – activatedgeek