没有glfw上下文无法编译着色器
Can't compile shader without glfw context
我正在尝试使用 Python 绑定编译 OpenGL 着色器。我无法在不创建 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)
对于任何 OpenGL 指令,当前有效的 OpenGL Context is required. QOpenGLWidget
创建并提供 OpenGL 上下文,但上下文仅在 initializeGL
、paintGL
之前分别变为当前 resizeGL
回调。
因此,您必须在 initializeGL
事件回调方法中移动创建和编译着色器的代码。
我正在尝试使用 Python 绑定编译 OpenGL 着色器。我无法在不创建 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)
对于任何 OpenGL 指令,当前有效的 OpenGL Context is required. QOpenGLWidget
创建并提供 OpenGL 上下文,但上下文仅在 initializeGL
、paintGL
之前分别变为当前 resizeGL
回调。
因此,您必须在 initializeGL
事件回调方法中移动创建和编译着色器的代码。