Я наконец пытаюсь изучить «современный» OpenGL и просматриваю здесь учебные пособия, но работаю на Python.
После того, как моя собственная попытка нарисовать треугольник не удалась (ничего не отображалось), я решил напрямую перенести решение C++ для упражнения 1 на Python.
Это результат, он почти 1:1 с кодом C++, за исключением того, что для краткости я удалил проверку ошибок компиляции/связывания шейдеров (после проверки того, что программы компилируются и компонуются без ошибок):
из системы импорта платформы импортировать numpy как np импортировать glfw из импорта OpenGL.GL * SCR_WIDTH = 800 SCR_HEIGHT = 600 vertex_shader_source = """ #версия 330 ядра макет (расположение = 0) в vec3 aPos; пустая функция() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); } """ фрагмент_шейдер_источник = """ #версия 330 ядра из vec4 FragColor; пустая функция() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); } """ защита основного (): # glfw: инициализация и настройка # ------------------------------ glfw.init() glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) если system() == "Дарвин": glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE) # создание окна glfw # -------------------- окно = glfw.create_window(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", Нет, Нет) glfw.make_context_current(окно) glfw.set_window_size_callback(окно, Framebuffer_size_callback) # создадим и скомпилируем нашу шейдерную программу # ------------------------------------ # вершинный шейдер vertex_shader = glCreateShader(GL_VERTEX_SHADER) glShaderSource(vertex_shader, vertex_shader_source) glCompileShader (vertex_shader) # фрагментный шейдер фрагмент_шейдер = glCreateShader(GL_FRAGMENT_SHADER) glShaderSource (fragment_shader, фрагмент_shader_source) glCompileShader (fragment_shader) # шейдеры ссылок шейдер_программа = glCreateProgram() glAttachShader (shader_program, vertex_shader) glAttachShader (shader_program, фрагмент_шейдер) glLinkProgram (shader_program) glDeleteShader (vertex_shader) glDeleteShader (fragment_shader) # настроить данные вершин (и буфер(ы)) и настроить атрибуты вершин # -------------------------------------------------- ----------------- вершины = np.array([ # первый треугольник -0,9, -0,5, 0,0, # слева -0.0, -0.5, 0.0, # вправо -0,45, 0,5, 0,0, # верх # второй треугольник 0.0, -0.5, 0.0, # слева 0,9, -0,5, 0,0, # вправо 0.45, 0.5, 0.0 # верх ], np.float32) вао = glGenVertexArrays(1) vbo = glGenBuffers(1) # Сначала привяжите объект массива вершин, затем привяжите и установите буфер(ы) вершин, а затем настройте атрибуты вершин. glBindVertexArray (вао) glBindBuffer (GL_ARRAY_BUFFER, вбо) glBufferData (GL_ARRAY_BUFFER, вершины, GL_STATIC_DRAW) glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 12, 0) glEnableVertexAttribArray (0) glBindBuffer (GL_ARRAY_BUFFER, 0) глбиндвертексаррай (0) # цикл рендеринга # ----------- пока не glfw.window_should_close(окно): # оказывать # ------ glClearColor(0.2, 0.3, 0.3, 1.0) glClear (GL_COLOR_BUFFER_BIT) # рисуем наш первый треугольник glUseProgram (shader_program) glBindVertexArray (вао) glDrawArrays (GL_TRIANGLES, 0, 6) # glfw: менять местами буферы и опрашивать события ввода-вывода (нажатие/отпускание клавиш, перемещение мыши и т. д.) # -------------------------------------------------- ------------------------------ glfw.swap_buffers (окно) glfw.poll_events() # необязательно: отменить распределение всех ресурсов, когда они пережили свое предназначение: # -------------------------------------------------- ----------------------- glDeleteVertexArrays(1, [вао]) glDeleteBuffers(1, [vbo]) glDeleteProgram (shader_program) # glfw: завершить работу, очистив все ранее выделенные ресурсы GLFW. # -------------------------------------------------- ----------------- glfw.terminate() def Framebuffer_size_callback (окно, ширина, высота): glViewport (0, 0, ширина, высота) если __name__ == "__main__": основной() К сожалению, он по-прежнему ничего не отображает:

Я не могу понять, почему, и у меня нет реальных идей, что попробовать. Кажется, все соответствует примеру решения.
Так что я 0 из 2 в своих экспериментах с шейдерами для рендеринга чего-либо. Что мне здесь не хватает?
Я использую Windows 10 с Nvidia Quadro RTX 4000. Python 3.11.1, PyOpenGL 3.1.6.
Мобильная версия