Невозможно скомпилировать шейдер без контекста glfw - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь скомпилировать шейдеры OpenGL, используя привязки Python. Я не могу скомпилировать их без создания контекста glfw, это довольно странно. Если вы раскомментируете строки glfw, шейдеры будут скомпилированы. print (bool (glCreateShader)) выводит False.

Ошибка:

Traceback (most recent call last):
  File "C:\Program Files\Python38\lib\site-packages\OpenGL\latebind.py", line 43, in __call__
    return self._finalCall( *args, **named )
TypeError: 'NoneType' object is not callable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/reas/Desktop/Programación/OpenGeEle/Moderno.py", line 44, in <module>
    shader = compileShader(vertex_src, GL_VERTEX_SHADER)
  File "C:\Program Files\Python38\lib\site-packages\OpenGL\GL\shaders.py", line 228, in compileShader
    shader = glCreateShader(shaderType)
  File "C:\Program Files\Python38\lib\site-packages\OpenGL\latebind.py", line 46, in __call__
    self._finalCall = self.finalise()
  File "C:\Program Files\Python38\lib\site-packages\OpenGL\extensions.py", line 242, in finalise
    raise error.NullFunctionError(
OpenGL.error.NullFunctionError: Attempt to call an undefined alternate function (glCreateShader, glCreateShaderObjectARB), check for bool(glCreateShader) before calling

Process finished with exit code 1

Исходный код:

import numpy as np
from numpy import array
from OpenGL.GL import (GL_ARRAY_BUFFER, GL_COLOR_BUFFER_BIT, GL_FRAGMENT_SHADER, GL_STATIC_DRAW,
                       GL_VERTEX_SHADER, glBindBuffer, glBufferData, glClear, glClearColor,
                       glGenBuffers)
from OpenGL.GL.shaders import compileShader, compileProgram
from PyQt5.QtWidgets import QApplication, QMainWindow, QOpenGLWidget

# IF I UNCOMMENT THIS, THE SHADERS WORK
"""
import glfw

glfw.init()
window = glfw.create_window(1280, 720, "My OpenGL window", None, None)
glfw.make_context_current(window)
"""

vertex_src = """
# version 330

in vec3 a_position;
in vec3 a_color;

out vec3 v_color;

void main()
{
    gl_Position = vec4(a_position, 1.0);
    v_color = a_color;
}
"""

fragment_src = """
# version 330

in vec3 v_color;
out vec4 out_color;

void main()
{
    out_color = vec4(v_color, 1.0);
}
"""

shader = compileShader(vertex_src, GL_VERTEX_SHADER)
shader2 = compileShader(fragment_src, GL_FRAGMENT_SHADER)
programa = compileProgram(shader, shader2)

1 Ответ

2 голосов
/ 01 апреля 2020

Для любой инструкции OpenGL требуется текущий и действительный Контекст OpenGL . QOpenGLWidget создает и предоставляет контекст OpenGL, но контекст обновляется только до обратного вызова initializeGL, paintGL соответственно resizeGL.
Следовательно, вам нужно переместить код, который создает и компилирует шейдер в методе обратного вызова события initializeGL.

...