OpenGL Frame Buffer Object для рендеринга в текстуры, странно рендерится - PullRequest
0 голосов
/ 05 января 2010

Я использую python, но OpenGL почти так же, как и на любом другом языке.

Проблема в том, что когда я пытаюсь отобразить текстуру или линию на текстуру с помощью буфера кадра, она отображается вверх ногами, слишком мала в левом нижнем углу. Очень странно. У меня есть эти картинки для демонстрации:

Вот так это выглядит,

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

Вот так это выглядело, когда я вместо этого использовал 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 Ответ

2 голосов
/ 05 января 2010

Вы не показываете свою матрицу проекции, поэтому я предполагаю, что она тоже идентична.

  • Источник кадрового буфера OpenGL находится внизу слева, а не вверху слева.
  • Проблема размераэто сложнее объяснить.В конце концов, какая у вас матрица проекции?
  • Кроме того, вы не показываете, как использовать текстуру, и я не уверен, что мы видим на вашем "неправильном" изображении.

Некоторые не относящиеся к делу комментарии:

  • создание кадрового буфера для каждого кадра - неправильный способ.
  • подумайте, зачем использовать кадровый буферсовсем ?кажется, что единственное, что вам нужно - это смешивание с кадровым буфером?glEnable(GL_BLEND) отлично справляется.
...