Python 带纹理的PyOpenGL球体

Python 带纹理的PyOpenGL球体,python,opengl,pyopengl,Python,Opengl,Pyopengl,我想使用Python-PyOpenGL生成三个球体的场景。侧边有两个颜色(红色和绿色)。中间一个,上面有任何纹理(砖块纹理,实际上是与代码位于同一目录中的方形jpg文件) 到目前为止,我所做的是: 从某种意义上说,由 GL()/生成的中间球中的纹理具有奇怪的行为。有一些小的绿色三角形,而不是我的纹理文件 这是我的纹理文件: 我尝试将此文件映射为曲面,例如中间球体上的纹理。我不知道问题出在哪里 这是我的代码,我不知道我错过了什么,也不知道在中间球体上获得正确的纹理贴图有什么错: from Op

我想使用Python-PyOpenGL生成三个球体的场景。侧边有两个颜色(红色和绿色)。中间一个,上面有任何纹理(砖块纹理,实际上是与代码位于同一目录中的方形jpg文件)

到目前为止,我所做的是:

从某种意义上说,由<代码> GL()/<代码>生成的中间球中的纹理具有奇怪的行为。有一些小的绿色三角形,而不是我的纹理文件

这是我的纹理文件:

我尝试将此文件映射为曲面,例如中间球体上的纹理。我不知道问题出在哪里

这是我的代码,我不知道我错过了什么,也不知道在中间球体上获得正确的纹理贴图有什么错:

from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import *
import sys
from PIL import Image as Image
import numpy

name = 'Navigation paradigm'

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
    glutInitWindowSize(800, 800)
    glutInitWindowPosition(350, 200)
    glutCreateWindow(name)
    glClearColor(0., 0., 0., 1.)
    glShadeModel(GL_SMOOTH)
    glEnable(GL_CULL_FACE)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_LIGHTING)
    lightZeroPosition = [10., 4., 10., 1.]
    lightZeroColor = [0.8, 1.0, 0.8, 1.0]
    glLightfv(GL_LIGHT0, GL_POSITION, lightZeroPosition)
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightZeroColor)
    glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1)
    glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05)
    glEnable(GL_LIGHT0)
    glutDisplayFunc(display_scene)
    glMatrixMode(GL_PROJECTION)
    gluPerspective(40., 1., 1., 40.)
    glMatrixMode(GL_MODELVIEW)
    gluLookAt(0, 0, 10,
              0, 0, 0,
              0, 1, 0)
    glPushMatrix()
    glutMainLoop()
    return

def display_scene():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    # Textured thing 
    tex = read_texture('brick.jpg')
    qobj = gluNewQuadric()
    gluQuadricTexture(qobj, GL_TRUE)
    glEnable(GL_TEXTURE_2D)
    glBindTexture(GL_TEXTURE_2D, tex)
    glBegin(GL_TRIANGLES)
    gluSphere(qobj, 1, 50, 50)
    gluDeleteQuadric(qobj)
    glDisable(GL_TEXTURE_2D)
    # Left sphere
    color = [1.0, 0.0, 0.0, 1.0]
    glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
    glTranslatef(-2, 0, 0)
    glutSolidSphere(1, 100, 20)
    # Right sphere
    color = [0.0, 1.0, 0.0, 1.0]
    glMaterialfv(GL_FRONT, GL_DIFFUSE, color)
    glTranslatef(4, 0, 0)
    glutSolidSphere(1, 100, 20)
    glPopMatrix()
    glutSwapBuffers()
    return

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

if __name__ == '__main__':
    main()
但眼前有一个稍微不同的“问题”。所以,万一其他人也有同样的问题,我会回答的。

首先,如注释中所述,您不需要调用
glBegin()
。因为
gluSphere()。此外,如果要调用
glBegin()
,还需要调用
glEnd()
。所以你看到一些东西的原因,基本上是因为你把你的司机弄糊涂了,然后它做了一些不该做的事情

read_texture()
中,生成纹理名称后,不绑定它。因此,后续与纹理相关的调用将指向默认纹理,而不是新创建的纹理

textID  = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, textID) # This is what's missing

添加缺少的
glBindTexture()
调用后,将得到如下结果

现在它可能看起来有点奇怪,可能看起来有点不对劲。但事实是,一切都正常运转。问题在于纹理本身

“问题”在于砖纹理不是球形贴图纹理。如果我们现在只使用球形贴图纹理替换砖块纹理,那么我们将得到以下结果

下面是上面使用的球形贴图纹理:


那是干什么的
glBegin()
根本不起作用。如果不使用该选项,则渲染带有纯色的中间球体。使用glBegin()可以在球体上至少进行三次尝试。如果我想绑定两个具有不同纹理的球,我需要一次又一次地加载img吗,或者我有办法切换这些绑定纹理吗