Pyopengl: цвет текстуры не совпадает при рендеринге.

avatar
thirdsandfourths
9 августа 2021 в 01:44
81
1
1

Цвет текстуры изменяется, когда она визуализируется с помощью OpenGL, и у меня нет другого предустановленного цвета в коде, кроме как во время glClear и один раз во время функции cube(). Примечание: изменение параметра формата glTexImage2D с GL_RGB на GL_BGR только меняет местами цвета.

Исходная текстура:

enter image description here

Визуализированная текстура:

enter image description here

Полный код:

import time
import numpy
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image

width = 500
height = 500

vertices = [(-1, -1, -1), (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, 1), (1, -1, 1), (1, 1, 1), (-1, 1, 1)]
faces = [(4, 0, 3, 7), (1, 0, 4, 5), (0, 1, 2, 3), (1, 5, 6, 2), (3, 2, 6, 7), (5, 4, 7, 6)]
colors = [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (1, 0, 1), (0, 1, 1)]


def cube():
    glRotatef(1, 3, 1, 1)
    glColor3fv((1, 1, 1))

    glBegin(GL_QUADS)
    for i, face in enumerate(faces):
        for surftex, vertex in enumerate(face):
            if surftex == 0:
                glTexCoord2f(0.0, 0.0)
            elif surftex == 1:
                glTexCoord2f(0.0, 1.0)
            elif surftex == 2:
                glTexCoord2f(1.0, 1.0)
            elif surftex == 3:
                glTexCoord2f(1.0, 0.0)
            glVertex3fv(vertices[vertex])
    glEnd()


def textureBind():
    img = Image.open('Image.png')
    img_data = numpy.array(list(img.getdata()), numpy.int8)
    glEnable(GL_TEXTURE_2D)
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER)
    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_RGBA, img.size[0], img.size[1],
                 0, GL_RGB, GL_FLOAT, img_data)

    return texture_id


def showScreen():
    global width, height
    glClearColor(0, 0, 0, 1)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    cube()
    glEnable(GL_DEPTH_TEST)
    glutSwapBuffers()


def mouseTracker(mousex, mousey):
    print(f"Mouse pos: {mousex}, {mousey}")


def reshapeWindow(x, y):
    global width, height
    width = x
    height = y
    print(x, y)
    glutReshapeWindow(width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, (width / height), 0.0001, 1000)
    glViewport(0, 0, width, height)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    glTranslatef(0, 0, -5)


glutInit()
glutInitDisplayMode(GLUT_RGBA)
glutInitWindowSize(500, 500)
wind = glutCreateWindow("OpenGL")
glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)
glutMotionFunc(mouseTracker)
glutPassiveMotionFunc(mouseTracker)
glutReshapeFunc(reshapeWindow)
gluPerspective(45, (width / height), 0.0001, 1000)
textureBind()

while True:
    glutMainLoopEvent()
    glutPostRedisplay()
    time.sleep(0.001)
Источник

Ответы (1)

avatar
Rabbid76
9 августа 2021 в 05:40
0

Формат этой текстуры — BGR, но не RGB. Используйте GL_BGR вместо GL_RGB:

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

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.size[0], img.size[1],
             0, GL_BGR, GL_FLOAT, img_data)

Формат изображения хранится в атрибуте mode объекта PIL.Image.Image. См. Режим.