Как вы применяете текстуры с помощью pyopengl?

Как применить текстуры к набору вершин? Я не могу понять, что я делаю неправильно.

Я не могу найти никаких руководств или чего-либо еще по этой теме, поэтому я в основном исхожу из документов OpenGL и случайных сценариев, которые я нахожу, поэтому мой код может не иметь никакого смысла. Мой сценарий слишком велик, чтобы публиковать его здесь, и большая его часть не имеет отношения к делу.

Мои настройки для текстуры:

def read_texture(filename):
    img = Image.open(filename)
    img_data = numpy.array(list(img.getdata()), numpy.int8)
    textID = glGenTextures(1)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img_data)
    return textID

Который я загрузил с помощью texture_0 = read_texture('texture.png').

Моя установка для куба:

генерировать вершины куба

    def gen_rect_prism_vertices(xloc,yloc,zloc,x,y,z):
        x *= 0.5
        y *= 0.5
        z *= 0.5
        vertices = (
            (xloc+x, yloc-y, zloc-z),
            (xloc+x, yloc+y, zloc-z),
            (xloc-x, yloc+y, zloc-z),
            (xloc-x, yloc-y, zloc-z),
            (xloc+x, yloc-y, zloc+z),
            (xloc+x, yloc+y, zloc+z),
            (xloc-x, yloc-y, zloc+z),
            (xloc-x, yloc+y, zloc+z)
            )
        return vertices

определение поверхностей

rect_prism_surfaces = (
    (0,1,2,3),
    (3,2,7,6),
    (6,7,5,4),
    (4,5,1,0),
    (1,5,7,2),
    (4,0,3,6)
    )

основная функция

def block(xloc,yloc,zloc,x,y,z):
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D,texture_0)
    vertices = gen_rect_prism_vertices(xloc,yloc,zloc,x,y,z)
    for surface in rect_prism_surfaces:
        n = 0
        glBegin(GL_QUADS)
        for vertex in surface:
            if n == 0:
                xv = 0.0
                yv = 0.0
            if n == 1:
                xv = 1.0
                yv = 0.0
            if n == 2:
                xv = 1.0
                yv = 1.0
            if n == 3:
                xv = 0.0
                yv = 1.0
            glTexCoord2f(xv,yv); glVertex3fv(vertices[vertex])
            n += 1
        glEnd()

Это результат. блокировать


person CMLSC    schedule 19.12.2017    source источник
comment
Похоже, вы не можете привязать текстуру, как в stackoverflow.com/questions/43033625/   -  person TEB    schedule 20.12.2017
comment
@TEB Я привязываю его в начале функции block. Так что это не так.   -  person CMLSC    schedule 20.12.2017
comment
О, подождите, я понимаю, что вы имеете в виду. Теперь это работает. Хотя часть проблемы заключалась в том, что моя версия PyOpenGL была немного испорчена, поэтому мне пришлось ее переустановить.   -  person CMLSC    schedule 20.12.2017


Ответы (1)


@TEB ответил в комментарии. Текстура должна быть связана (с glBindTexture(GL_TEXTURE_2D,texture_0)) в read_texture(), где генерируется идентификатор текстуры.

person CMLSC    schedule 21.12.2017