Я провел последнюю неделю, играя с NumPy для генерации случайных текстур.Я наткнулся на это сообщение и попробовал принятые ответы.
Я могу подтвердить, что ранее принятый ответ НЕ ПРАВИЛЬНО .
Кажется правильным, потому что вы используете серыймасштабировать изображения.Но если бы вы использовали цветное изображение (например, RGBA) и обнулили каналы GBA, вы бы обнаружили это, потому что вы все равно бы получили зеленый и синий цвета в вашей текстуре.
Используя __str __ ()вы на самом деле отправляете мусор, а не значения, которые вам действительно нужны.
Я буду использовать мой код для демонстрации этого.
import numpy
import pyglet
from pyglet.gl import *
# the size of our texture
dimensions = (16, 16)
# we need RGBA textures
# which has 4 channels
format_size = 4
bytes_per_channel = 1
# populate our array with some random data
data = numpy.random.random_integers(
low = 0,
high = 1,
size = (dimensions[ 0 ] * dimensions[ 1 ], format_size)
)
# convert any 1's to 255
data *= 255
# set the GB channels (from RGBA) to 0
data[ :, 1:-1 ] = 0
# ensure alpha is always 255
data[ :, 3 ] = 255
# we need to flatten the array
data.shape = -1
Используя ответ выше, вы сделаете следующее
НЕ ДЕЛАЙТЕ ЭТОГО!
tex_data = data.astype('uint8').__str__()
Если вы попробуете код, вы получите все цвета, а не только красный!
Сделайте это вместо этого!
Правильный способ - конвертировать в GLubytes ctype.
# convert to GLubytes
tex_data = (GLubyte * data.size)( *data.astype('uint8') )
Затем вы можете передать это в вашу текстуру.
# create an image
# pitch is 'texture width * number of channels per element * per channel size in bytes'
return pyglet.image.ImageData(
dimensions[ 0 ],
dimensions[ 1 ],
"RGBA",
tex_data,
pitch = dimensions[ 1 ] * format_size * bytes_per_channel
)