pyopengl创建着色器绘制不同颜色的点
时间: 2023-06-12 10:08:09 浏览: 120
opengl着色语言
3星 · 编辑精心推荐
下面是一个使用 PyOpenGL 创建着色器并绘制不同颜色点的示例代码:
```python
import glfw
from OpenGL.GL import *
from OpenGL.GL.shaders import compileProgram, compileShader
import numpy as np
# 顶点着色器代码
vertex_shader = """
#version 330
in vec3 position;
void main() {
gl_Position = vec4(position, 1.0);
}
"""
# 片段着色器代码
fragment_shader = """
#version 330
out vec4 color;
void main() {
color = vec4(1.0, 0.0, 0.0, 1.0);
}
"""
# 初始化glfw
if not glfw.init():
raise Exception("glfw初始化失败")
# 创建窗口
window = glfw.create_window(640, 480, "PyOpenGL示例", None, None)
if not window:
glfw.terminate()
raise Exception("创建窗口失败")
# 设置当前窗口为OpenGL上下文
glfw.make_context_current(window)
# 编译着色器
shader = compileProgram(compileShader(vertex_shader, GL_VERTEX_SHADER), compileShader(fragment_shader, GL_FRAGMENT_SHADER))
# 设置着色器
glUseProgram(shader)
# 顶点数据
vertices = np.array([
0.0, 0.5, 0.0, # 顶点1坐标
-0.5, -0.5, 0.0, # 顶点2坐标
0.5, -0.5, 0.0, # 顶点3坐标
], dtype=np.float32)
# 创建缓冲区对象
vbo = glGenBuffers(1)
# 绑定缓冲区对象
glBindBuffer(GL_ARRAY_BUFFER, vbo)
# 设置数据
glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW)
# 获取位置属性的位置
position = glGetAttribLocation(shader, "position")
# 开启位置属性
glEnableVertexAttribArray(position)
# 设置位置属性数据
glVertexAttribPointer(position, 3, GL_FLOAT, False, 0, None)
# 渲染循环
while not glfw.window_should_close(window):
# 清空颜色缓冲区
glClear(GL_COLOR_BUFFER_BIT)
# 绘制三角形
glDrawArrays(GL_TRIANGLES, 0, 3)
# 交换缓冲区
glfw.swap_buffers(window)
# 处理事件
glfw.poll_events()
# 删除着色器程序
glDeleteProgram(shader)
# 终止glfw
glfw.terminate()
```
在上面的示例代码中,我们使用了 PyOpenGL 库创建了一个窗口,并编译了一个顶点着色器和一个片段着色器。在顶点着色器中,我们只是简单地将顶点的位置设置为输出位置。在片段着色器中,我们将颜色设置为红色。
然后,我们定义了一个包含三个顶点的三角形,并将它们存储在一个 NumPy 数组中。我们创建了一个缓冲区对象,并将顶点数据存储到该缓冲区中。然后,我们启用位置属性,并将顶点数据绑定到该属性上。
最后,我们进入渲染循环,在其中使用 glDrawArrays 函数绘制三角形。注意,在每个渲染循环中,我们都要清空颜色缓冲区,并交换缓冲区。
阅读全文