Почему моя текстура не показывает PyOpenGL

Я пробовал все, но все-таки я не получу свою ошибку. Я пытаюсь поместить текстуру в объект сферы.

""" Minimal texture on sphere demo This is demo for showing how to put image on sphere as texture in PyOpenGL. """ from OpenGL.GLUT import * from OpenGL.GLU import * from OpenGL.GL import * from PIL import Image import numpy def run_scene(): glutInit() glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) glutCreateWindow("Minimal sphere OpenGL") lightning() glutDisplayFunc(draw_sphere) 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 lightning(): glEnable(GL_DEPTH_TEST) glEnable(GL_LIGHTING) glEnable(GL_BLEND) glLightfv(GL_LIGHT0, GL_POSITION, [10, 4, 10, 1]) glLightfv(GL_LIGHT0, GL_DIFFUSE, [0.8, 1, 0.8, 1]) glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1) glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05) glEnable(GL_LIGHT0) return def draw_sphere(): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glPushMatrix() texture_id = read_texture('mars.png') glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, texture_id) glEnable(GL_TEXTURE_GEN_S) glEnable(GL_TEXTURE_GEN_T) glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP) glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP) glutSolidSphere(1, 50, 50) glDisable(GL_TEXTURE_2D) glPopMatrix() glutSwapBuffers() return def read_texture(filename): img = Image.open(filename) img_data = numpy.array(list(img.getdata()), numpy.int8) texture_id = 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 texture_id if __name__ == '__main__': run_scene() 

Это результат этого кода, простая зеленая сфера:

  • Отобразить текстурированный прямоугольник с PyOpenGL
  • базовый openGL, вершинные буферы и пиглеты
  • Строительство Mesa для окон 7. Mesa 9.1
  • Как указать смещение буфера с PyOpenGL
  • Отображать массив NumPy как постоянное обновление изображения с помощью Glumpy
  • Координаты текстуры около 1 ведут себя странно
  • введите описание изображения здесь

    Но это не мой ожидаемый результат. Я хочу просто показать эту текстуру mars.png на поверхности сферы:

    введите описание изображения здесь

    Помогите мне с этим, я не могу решить это сам по себе.

  • matplotlib: отображение в буфер / данные пикселя доступа
  • базовый openGL, вершинные буферы и пиглеты
  • Захват окна GTK: приложение VPython (OpenGL)
  • Отображать массив NumPy как постоянное обновление изображения с помощью Glumpy
  • Как правильно использовать gluLookAt?
  • Отобразить текстурированный прямоугольник с PyOpenGL
  • One Solution collect form web for “Почему моя текстура не показывает PyOpenGL”

    В read_texture() после создания имени текстуры вы не привязываете его. Таким образом, последующие вызовы, связанные с текстурой, идут к текстуре по умолчанию, а не к вашей вновь созданной текстуре.

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

    Также, поскольку ваше изображение является PNG-изображением. Затем list(img.getdata()) будет списком кортежей, содержащих (R, G, B, A) . Поэтому при вызове glTexImage2D вам нужно сказать, что ваши данные GL_RGBA а не GL_RGB .

     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, img_data) 

    Вы также можете автоматизировать его.

     format = GL_RGB if img.mode == "RGB" else GL_RGBA glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.size[0], img.size[1], 0, format, GL_UNSIGNED_BYTE, img_data) 

    Вы также можете преобразовать его, чтобы не иметь альфа-канала.

     img = img.convert("RGB") 

    Который, конечно, должен быть выполнен до вызова img.getdata() .

    Теперь вы должны увидеть следующее:

    Также важно отметить. Вы вызываете read_texture() в draw_sphere() . Это означает, что каждый раз, когда draw_sphere() , изображение загружается и создается новая текстура. Вы действительно не хотите этого делать. Вместо этого перед вызовом glutMainLoop() вызовите read_texture() и сохраните результат как глобальное имя.

    Python - лучший язык программирования в мире.