Мне нужно рисовать пиксели, а затем менять их размеры, поэтому один пиксель дисплея содержит 9 программных пикселей.
import random
from pyglet.gl import *
from OpenGL.GLUT import *
win = pyglet.window.Window()
@win.event
def on_draw():
W = 200
H = 200
glClearColor(0, 0, 0, 1)
glClear(GL_COLOR_BUFFER_BIT)
data = [[[0] * 3 for j in range(W)] for i in range(H)]
for y in range (0, H):
for x in range (0, W):
data[y][x][0] = random.randint(0, 255)
data[y][x][1] = random.randint(0, 255)
data[y][x][2] = random.randint(0, 255)
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_INT, data)
glutSwapBuffers()
pyglet.app.run()
я получаю эту ошибку
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_INT, data)
ctypes.ArgumentError: argument 5: : wrong type
Данные, которые передаются в glDrawPixels
, должны быть массивом значений GLuint
, а не вложенным списком значений.
Если вы хотите определить цветовые каналы целыми значениями в диапазоне [0, 255], вам нужно использовать тип данных GLubyte
и соответствующую константу перечислителя OpenGL GL_UNSIGNED_BYTE
, а не GL_UNSIGNED_INT
.
например
data = [random.randint(0, 255) for _ in range (0, H*W*3)]
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_BYTE, (GLubyte * len(data))(*data))
Если вы все равно будете использовать GLuint
соответственно GL_UNSIGNED_INT
, то интегральные цветовые каналы должны быть в диапазоне [0, 2147483647]:
например
data = [random.randint(0, 2147483647) for _ in range (0, H*W*3)]
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_INT, (GLuint * len(data))(*data))