【问题标题】:How do you apply textures with pyopengl?如何使用 pyopengl 应用纹理?
【发布时间】:2017-12-21 08:32:27
【问题描述】:

如何将纹理应用到一组顶点?我不知道我做错了什么。

我找不到任何关于这个主题的教程或任何东西,所以我主要使用我找到的 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()

这就是结果。

【问题讨论】:

  • 看起来你可能没有像stackoverflow.com/questions/43033625/…那样绑定纹理
  • @TEB 我将它绑定在block 函数的开头。所以不是这样。
  • 哦等等,我明白你的意思了。现在可以了。虽然部分问题是我的 PyOpenGL 版本有点乱,所以我不得不重新安装它。

标签: python opengl pyopengl


【解决方案1】:

@TEB 在评论中回答。纹理需要在生成纹理ID的read_texture()中绑定(使用glBindTexture(GL_TEXTURE_2D,texture_0))。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 2018-09-16
    • 2012-10-26
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多