OpenGL Frame Buffer Object用于渲染纹理,呈现奇怪的效果

时间:2010-01-04 23:21:30

标签: opengl object buffer textures frame

我正在使用python,但OpenGL与其他任何语言完全相同。

问题在于,当我尝试通过帧缓冲对象将纹理或线条渲染到纹理时,它会在左下角呈现倒置,太小。很奇怪。我有这些照片来证明:

这是它的外观,

www.godofgod.co.uk/my_files/Incorrect_operation.png

这就是我在使用pygame时的样子。我知道Pygame太慢了。没有OpenGL的速度,我的游戏将无法播放。忽略弯曲的角落。我还没有在OpenGL中实现它们。我需要先解决这个问题。

www.godofgod.co.uk/my_files/Correct_operation.png

我没有使用深度。

什么可能导致这种不稳定的行为。这是代码(函数在实际代码中缩进。它确实显示正确),你可能会觉得有用,

def texture_to_texture(target,surface,offset): #Target is an object of a class which contains texture data. This texture should be the target. Surface is the same but is the texture which should be drawn onto the target. offset is the offset where the surface texture will be drawn on the target texture.
#This will create the textures if not already. It will create textures from image data or block colour. Seems to work fine as direct rendering of textures to the screen works brilliantly.
if target.texture == None:
    create_texture(target)
if surface.texture == None:
    create_texture(surface)
frame_buffer =  glGenFramebuffersEXT(1)
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frame_buffer)
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, target.texture, 0) #target.texture is the texture id from the object
glPushAttrib(GL_VIEWPORT_BIT)
glViewport(0,0,target.surface_size[0],target.surface_size[1])
draw_texture(surface.texture,offset,surface.surface_size,[float(c)/255.0 for c in surface.colour]) #The last part changes the 0-255 colours to 0-1 The textures when drawn appear to have the correct colour. Don't worry about that.
glPopAttrib()
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
glDeleteFramebuffersEXT(1, [int(frame_buffer)]) #Requires the sequence of the integer conversion of the ctype variable, meaning [int(frame_buffer)] is the odd required way to pass the frame buffer id to the function.

此功能也可能有用,

def draw_texture(texture,offset,size,c):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() #Loads model matrix
glColor4fv(c)
glBegin(GL_QUADS)
glVertex2i(*offset) #Top Left
glVertex2i(offset[0],offset[1] + size[1]) #Bottom Left
glVertex2i(offset[0] + size[0],offset[1] + size[1]) #Bottom, Right
glVertex2i(offset[0] + size[0],offset[1]) #Top, Right
glEnd()
glColor4fv((1,1,1,1))
glBindTexture(GL_TEXTURE_2D, texture)
glBegin(GL_QUADS)
glTexCoord2f(0.0, 0.0)
glVertex2i(*offset) #Top Left
glTexCoord2f(0.0, 1.0)
glVertex2i(offset[0],offset[1] + size[1]) #Bottom Left
glTexCoord2f(1.0, 1.0)
glVertex2i(offset[0] + size[0],offset[1] + size[1]) #Bottom, Right
glTexCoord2f(1.0, 0.0)
glVertex2i(offset[0] + size[0],offset[1]) #Top, Right
glEnd()

1 个答案:

答案 0 :(得分:2)

你没有显示你的投影矩阵,所以我也会假设它也是一样的。

  • OpenGL帧缓冲区原点位于左下角,而不是左上角。
  • 尺寸问题更难以解释。毕竟你的投影矩阵是什么?
  • 另外,你没有展示如何使用纹理,我不确定我们在你的“错误”图像中看到了什么。

一些不相关的评论:

  • 每帧创建一个帧缓冲区不是正确的方法。
  • 来考虑一下,为什么要使用framebuffer?似乎你唯一想要的是混合到帧缓冲区? glEnable(GL_BLEND)做得很好。