【问题标题】:uv mapping python OpenGL trianglesuv映射python OpenGL三角形
【发布时间】:2012-02-02 23:16:12
【问题描述】:

我试图用 pyOpenGL 显示一个简单的立即模式纹理多边形集,但没有运气。我已经将一些代码拼凑在一起,这些代码加载了一些几何数据并且一切正常,据我所知,我有所有代码可以向它添加纹理,但只是得到白色多边形。

这是代码的重要部分:

self.img = PIL.Image.open('/projects/openGL_robot_face/facemap.png')
self.image_data = numpy.array(list(self.img.getdata()), numpy.uint8)

def paintGL(self):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)


    texture = glGenTextures( 1)
    glPixelStorei(GL_UNPACK_ALIGNMENT,1)
    glBindTexture(GL_TEXTURE_2D, texture)
    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_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, self.img.size[0], self.img.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, self.image_data)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslate(0.0, 0.0, -50.0)
    glScale(20.0, 20.0, 20.0)
    glRotate(self.yRotDeg, 0.2, 1.0, 0.3)
    glTranslate(-0.5, -0.5, -0.5)

    glBegin(GL_TRIANGLES)
    for vert in self.poly_verts:
        glTexCoord2f(vert[6], vert[7])
        glVertex3f(vert[0], vert[1], vert[2])

    glEnd()

【问题讨论】:

    标签: python opengl textures pyopengl


    【解决方案1】:

    您是否在 OpenGL 中启用了纹理,使用:

    glEnable(GL_TEXTURE_2D)
    

    另外,您不应该在每次 Paint 调用时创建纹理,您应该一劳永逸地创建它(使用 glGenTextures 和 glTex*),然后存储纹理 ID,并在 Paint 期间执行严格的最小值,这是绑定与纹理。

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    
        glEnable(GL_TEXTURE_2D)
        glBindTexture(GL_TEXTURE_2D, texture)
    
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        glTranslate(0.0, 0.0, -50.0)
        glScale(20.0, 20.0, 20.0)
        glRotate(self.yRotDeg, 0.2, 1.0, 0.3)
        glTranslate(-0.5, -0.5, -0.5)
    
        glBegin(GL_TRIANGLES)
        for vert in self.poly_verts:
            glTexCoord2f (vert[6], vert[7]);
            glVertex3f(vert[0], vert[1], vert[2])
    
        glEnd()
        glDisable(GL_TEXTURE_2D)
    

    不幸的是,我现在无法尝试答案,所以这纯粹是我的想法。 您可能会从上一篇文章中受益: Render a textured rectangle with PyOpenGL

    【讨论】:

    • 是的,你是对的,glEnable(GL_TEXTURE_2D) 修复了它,我将纹理加载移出循环,因为我意识到这是一个巨大的内存泄漏!问题是我每次在循环内调用 glTexCoord2f 时仍然泄漏内存
    • 内存泄漏是 pyOpenGL 最新版本中的一个错误...花了一段时间才弄清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2013-08-14
    • 2013-10-13
    • 2011-04-04
    • 1970-01-01
    • 2018-02-21
    • 2013-12-07
    相关资源
    最近更新 更多