export uses padding to prevent edge effects

This commit is contained in:
Luke Campagnola 2013-06-19 09:10:14 -04:00
parent e864043e76
commit 1b17bc6adb

View File

@ -346,7 +346,7 @@ class GLViewWidget(QtOpenGL.QGLWidget):
return img return img
def renderToArray(self, size, format=GL_BGRA, type=GL_UNSIGNED_BYTE): def renderToArray(self, size, format=GL_BGRA, type=GL_UNSIGNED_BYTE, textureSize=1024, padding=256):
w,h = map(int, size) w,h = map(int, size)
self.makeCurrent() self.makeCurrent()
@ -360,7 +360,7 @@ class GLViewWidget(QtOpenGL.QGLWidget):
glEnable(GL_TEXTURE_2D) glEnable(GL_TEXTURE_2D)
tex = glGenTextures(1) tex = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, tex) glBindTexture(GL_TEXTURE_2D, tex)
texwidth = 512 texwidth = textureSize
data = np.zeros((texwidth,texwidth,4), dtype=np.ubyte) data = np.zeros((texwidth,texwidth,4), dtype=np.ubyte)
## Test texture dimensions first ## Test texture dimensions first
@ -372,22 +372,23 @@ class GLViewWidget(QtOpenGL.QGLWidget):
self.opts['viewport'] = (0, 0, w, h) # viewport is the complete image; this ensures that paintGL(region=...) self.opts['viewport'] = (0, 0, w, h) # viewport is the complete image; this ensures that paintGL(region=...)
# is interpreted correctly. # is interpreted correctly.
p2 = 2 * padding
for x in range(0, w, texwidth): for x in range(-padding, w-padding, texwidth-p2):
for y in range(0, h, texwidth): for y in range(-padding, h-padding, texwidth-p2):
x2 = min(x+texwidth, w) x2 = min(x+texwidth, w+padding)
y2 = min(y+texwidth, h) y2 = min(y+texwidth, h+padding)
w2 = x2-x w2 = x2-x
h2 = y2-y h2 = y2-y
## render to texture ## render to texture
glfbo.glFramebufferTexture2D(glfbo.GL_FRAMEBUFFER, glfbo.GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0) glfbo.glFramebufferTexture2D(glfbo.GL_FRAMEBUFFER, glfbo.GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0)
self.paintGL(region=(x, h-y-h2, w2, h2), viewport=(0, 0, w2, h2)) # only render sub-region self.paintGL(region=(x, h-y-h2, w2, h2), viewport=(0, 0, w2, h2)) # only render sub-region
## read texture back to array ## read texture back to array
data = glGetTexImage(GL_TEXTURE_2D, 0, format, type) data = glGetTexImage(GL_TEXTURE_2D, 0, format, type)
data = np.fromstring(data, dtype=np.ubyte).reshape(texwidth,texwidth,4).transpose(1,0,2)[:, ::-1] data = np.fromstring(data, dtype=np.ubyte).reshape(texwidth,texwidth,4).transpose(1,0,2)[:, ::-1]
output[x:x2, y:y2] = data[:w2, -h2:] output[x+padding:x2-padding, y+padding:y2-padding] = data[padding:w2-padding, -(h2-padding):-padding]
finally: finally:
self.opts['viewport'] = None self.opts['viewport'] = None