Как я могу рисовать / работать с пикселями в python с помощью opengl / pyglet и изменять размеры этих пикселей? - PullRequest
1 голос
/ 09 апреля 2019

Мне нужно нарисовать пиксели, а затем изменить их размеры, чтобы один пиксель дисплея содержал 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: аргумент 5:: неверный тип

1 Ответ

1 голос
/ 09 апреля 2019

Данные, которые передаются в 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]:

, например * * 1016

data = [random.randint(0, 2147483647) for _ in range (0, H*W*3)]
glDrawPixels(W, H, GL_RGB, GL_UNSIGNED_INT, (GLuint * len(data))(*data)) 
...