PyQt, PyOPENGL: при добавлении текстуры в область другие области теряют свой цвет и становятся белыми - PullRequest
0 голосов
/ 07 ноября 2018

Это настройка текстуры.

    img1 = Image.open(".\\pictures\\checkboard.jpg")
    img1_data = np.array(list(img1.getdata()), np.int8)
    glGenTextures(2)
    glBindTexture(GL_TEXTURE_2D, 2)
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
    glTexImage2D(GL_TEXTURE_2D, 0, 3, img1.size[0], img1.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, img1_data)
    # 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)

Когда я добавил эту текстуру в область, нижняя область стала белой. Это так странно, потому что нижняя область красного цвета в моем программа.

    glColor3f(1, 0, 0)
    glBegin(GL_QUADS)
    glVertex3f(-0.1, 0.1, 0)
    glVertex3f(-0.1, -0.1, 0)
    glVertex3f(0.1, -0.1, 0)
    glVertex3f(0.1, 0.1, 0)
    glEnd()

1 Ответ

0 голосов
/ 07 ноября 2018

По умолчанию цвет текстуры умножается на текущий цвет, потому что по умолчанию режим текстурной среды (GL_TEXTURE_ENV_MODE) равен GL_MODULATE. См glTexEnv.

Когда режим среды изменяется на GL_DECAL, цвет и текстура смешиваются в зависимости от альфа-канала текстуры.
Миксин может быть выражен как

final_color = color * (1 - texture_color.a) + texture_color *⁢ texture_color.a

или

final_color = mix(color, texture_color, texture_color.a)

Если вы рисуете квад без указания текстурных координат, все их текстурные координаты одинаковы и имеют значение, которое в последний раз было установлено glTexCoord.
Поскольку вы получаете квад white , кажется, что тексель в позиции координаты текстуры полностью белый с альфа-каналом 1 (или текстура не имеет альфа-канала, поэтому он равен 1 по умолчанию).

Вы должны отключить текстурирование, прежде чем рисовать квад для решения вашей проблемы. См glEnable:

glDisable(GL_TEXTURE_2D)
glColor3f(1, 0, 0)
glBegin(GL_QUADS)
glVertex3f(-0.1, 0.1, 0)
glVertex3f(-0.1, -0.1, 0)
glVertex3f(0.1, -0.1, 0)
glVertex3f(0.1, 0.1, 0)
glEnd()
glEnable(GL_TEXTURE_2D)
...