如何在Python中为GLFW设置窗口提示

问题描述

我已经编写了这段Python代码,它将在使用GLFW创建的窗口中绘制一个三角形:

import glfw
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram,compileShader
import numpy as np

vertex_src = """
# version 330 core
in vec3 a_position;
void main() {
    gl_position = vec4(a_position,1.0);
}
"""

fragment_src = """
# version 330 core
out vec4 out_color;
void main() {
    out_color = vec4(1.0,0.0,1.0);
}
"""

if not glfw.init():
    print("Cannot initialize GLFW")
    exit()

window = glfw.create_window(320,240,"OpenGL window",None,None)
if not window:
    glfw.terminate()
    print("GLFW window cannot be creted")
    exit()

glfw.set_window_pos(window,100,100)
glfw.make_context_current(window)

vertices = [-0.5,-0.5,0.5,0.0]
colors = [1,1.0,1.0]
vertices = np.array(vertices,dtype=np.float32)
colors = np.array(colors,dtype=np.float32)
shader = compileProgram(compileShader(
    vertex_src,GL_VERTEX_SHADER),compileShader(fragment_src,GL_FRAGMENT_SHADER))
buff_obj = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER,buff_obj)
glBufferData(GL_ARRAY_BUFFER,vertices.nbytes,vertices,GL_STATIC_DRAW)
position = glGetAttribLocation(shader,"a_position")
glEnableVertexAttribArray(position)
glVertexAttribPointer(position,3,GL_FLOAT,GL_FALSE,ctypes.c_void_p(0))
glUseProgram(shader)
glClearColor(0,0.1,1)

while not glfw.window_should_close(window):
    glfw.poll_events()
    glfw.swap_buffers(window)

glfw.terminate()

在运行程序时,出现此错误:

Traceback (most recent call last):
  File "opengl.py",line 43,in <module>
    shader = compileProgram(compileShader(
  File "/usr/local/lib/python3.8/dist-packages/OpenGL/GL/shaders.py",line 235,in compileShader
    raise ShaderCompilationError(
OpenGL.GL.shaders.ShaderCompilationError: ("Shader compile failure (0): b'0:2(10): error: GLSL 3.30 is not supported. Supported versions are: 1.10,1.20,1.30,1.00 ES,and 3.00 ES\\n'",[b'\n# version 330 core\nin vec3 a_position;\nvoid main() {\n    gl_position = vec4(a_position,1.0);\n}\n'],GL_VERTEX_SHADER)

它清楚表明不支持GLSL 3.30。但是,这确实可以通过设置窗口提示在C中工作:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);

如何在Python中设置这些窗口提示?

解决方法

使用Python语法是

glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR,3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR,3)

请注意,片段着色器中有一个错字。 GLSL区分大小写。它必须是gl_Position而不是gl_position


在核心配置文件OpenGL Context中,您必须使用命名的Vertex Array Object,因为默认的顶点数组对象(0)无效:

vao = glGenVertexArrays(1) # <----
glBindVertexArray(vao)     # <----

position = glGetAttribLocation(shader,"a_position")
glEnableVertexAttribArray(position)
glVertexAttribPointer(position,3,GL_FLOAT,GL_FALSE,ctypes.c_void_p(0))

最后,您错过了绘制几何图形的步骤。清除帧缓冲区并绘制数组:

while not glfw.window_should_close(window):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glDrawArrays(GL_TRIANGLES,3)
    glfw.poll_events()
    glfw.swap_buffers(window)

完整示例:

import glfw
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram,compileShader
import numpy as np

vertex_src = """
# version 330 core
in vec3 a_position;
void main() {
    gl_Position = vec4(a_position,1.0);
}
"""

fragment_src = """
# version 330 core
out vec4 out_color;
void main() {
    out_color = vec4(1.0,0.0,1.0);
}
"""

if not glfw.init():
    print("Cannot initialize GLFW")
    exit()

glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR,3)
glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT,True)
glfw.window_hint(glfw.OPENGL_PROFILE,glfw.OPENGL_CORE_PROFILE)
window = glfw.create_window(320,240,"OpenGL window",None,None)
if not window:
    glfw.terminate()
    print("GLFW window cannot be creted")
    exit()

glfw.set_window_pos(window,100,100)
glfw.make_context_current(window)

vertices = [-0.5,-0.5,0.5,0.0]
colors = [1,1.0,1.0]
vertices = np.array(vertices,dtype=np.float32)
colors = np.array(colors,dtype=np.float32)
shader = compileProgram(compileShader(
    vertex_src,GL_VERTEX_SHADER),compileShader(fragment_src,GL_FRAGMENT_SHADER))

buff_obj = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER,buff_obj)
glBufferData(GL_ARRAY_BUFFER,vertices.nbytes,vertices,GL_STATIC_DRAW)

vao = glGenVertexArrays(1)
glBindVertexArray(vao)

position = glGetAttribLocation(shader,ctypes.c_void_p(0))

glUseProgram(shader)
glClearColor(0,0.1,1)

while not glfw.window_should_close(window):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glDrawArrays(GL_TRIANGLES,3)
    glfw.poll_events()
    glfw.swap_buffers(window)

glfw.terminate()

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...