Pyglet ctypes pyglet.gl.lib.GLException: b 'недопустимая операция' - PullRequest
0 голосов
/ 19 марта 2020

Здравствуйте, у меня есть эта ошибка в anaconda 3.7 и pycharm с pyglet.gl и ctypes (этот код взят из видео, за которым я следую)

Triangle2.py:

from pyglet.gl import *
import ctypes

class Triangle:
    def __init__(self):

        self.triangle = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0,
                          0.5, -0.5, 0.0, 0.0, 1.0, 0.0,
                          0.0,  0.5, 0.0, 0.0, 0.0, 1.0]

        self.vertex_shader_source = b"""
        #version 330
        in layout(location = 0) vec3 position;
        in layout(location = 1) vec3 color;

        out vec3 newColor;
        void main()
        {
            gl_Position = vec4(position, 1.0f);
            newColor = color;
        }
        """

        self.fragment_shader_source = b"""
        #version 330
        in vec3 newColor;

        out vec4 outColor;
        void main()
        {
            outColor = vec4(newColor, 1.0f);
        }
        """

        vertex_buff = ctypes.create_string_buffer(self.vertex_shader_source)
        c_vertex = ctypes.cast(ctypes.pointer(ctypes.pointer(vertex_buff)), ctypes.POINTER(ctypes.POINTER(GLchar)))
        vertex_shader = glCreateShader(GL_VERTEX_SHADER)
        glShaderSource(vertex_shader, 1, c_vertex, None)
        glCompileShader(vertex_shader)

        fragment_buff = ctypes.create_string_buffer(self.fragment_shader_source)
        c_fragment = ctypes.cast(ctypes.pointer(ctypes.pointer(fragment_buff)), ctypes.POINTER(ctypes.POINTER(GLchar)))
        fragment_shader = glCreateShader(GL_FRAGMENT_SHADER)
        glShaderSource(fragment_shader, 1, c_fragment, None)
        glCompileShader(fragment_shader)

        shader = glCreateProgram()
        glAttachShader(shader, vertex_shader)
        glAttachShader(shader, fragment_shader)
        glLinkProgram(shader)

        glUseProgram(shader)

        vbo = GLuint(0)
        glGenBuffers(1, vbo)

        glBindBuffer(GL_ARRAY_BUFFER, vbo)
        glBufferData(GL_ARRAY_BUFFER, 72, (GLfloat * len(self.triangle))(*self.triangle), GL_STATIC_DRAW)

        #positions
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(0))
        glEnableVertexAttribArray(0)

        #colors
        glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(12))
        glEnableVertexAttribArray(1)

Window2 .py:

from pyglet.gl import *
from Triangle2 import Triangle

class MyWindow(pyglet.window.Window):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.set_minimum_size(400, 300)
        glClearColor(0.2, 0.3, 0.2, 1.0)

        self.triangle = Triangle()


    def on_draw(self):
        self.clear()
        glDrawArrays(GL_TRIANGLES, 0, 3)

    def on_resize(self, width, height):
        glViewport(0, 0, width, height)


if __name__ == "__main__":
    window = MyWindow(1280, 720, "My Pyglet Window", resizable=True)
    pyglet.app.run()

Вот ошибка:

    Traceback (most recent call last):
  File "D:/Pyglet_OpenGL_tutorials-master/Pyglet_OpenGL_tutorials-master/Video_04_shaders_the_long_way/Window2.py", line 22, in <module>
    window = MyWindow(1280, 720, "My Pyglet Window", resizable=True)
  File "D:/Pyglet_OpenGL_tutorials-master/Pyglet_OpenGL_tutorials-master/Video_04_shaders_the_long_way/Window2.py", line 10, in __init__
    self.triangle = Triangle()
  File "D:\Pyglet_OpenGL_tutorials-master\Pyglet_OpenGL_tutorials-master\Video_04_shaders_the_long_way\Triangle2.py", line 52, in __init__
    glUseProgram(shader)
  File "C:\Users\the1s\.conda\envs\pyrer\lib\site-packages\pyglet\gl\lib_wgl.py", line 107, in __call__
    return self.func(*args, **kwargs)
  File "C:\Users\the1s\.conda\envs\pyrer\lib\site-packages\pyglet\gl\lib.py", line 106, in errcheck
    raise GLException(msg)
pyglet.gl.lib.GLException: b'invalid operation'

Я получил код с youtuber из github и сравнил его в pycharm с моим кодом. Они точно такие же и возвращают ту же ошибку. По этой причине я думаю, что это не опечатка, а что-то в модуле.

...