使用ModernGL的条件语句和着色器变量来指定应用着色器的元素,示例如下:
import moderngl
import numpy as np
# 顶点坐标和颜色数据
vertices = np.array([
# 位置 # 颜色
0.5, -0.5, 0.0, 1.0, 0.0, 0.0, # 红色
-0.5, -0.5, 0.0, 0.0, 1.0, 0.0, # 绿色
0.0, 0.5, 0.0, 0.0, 0.0, 1.0, # 蓝色
])
# 创建ModernGL上下文
ctx = moderngl.create_standalone_context()
# 创建VAO和缓冲区
vao = ctx.simple_vertex_array(
ctx.program(vertex_shader='''
#version 330
in vec3 in_pos;
in vec3 in_color;
out vec3 color;
void main() {
gl_Position = vec4(in_pos, 1.0);
color = in_color;
}
''', fragment_shader='''
#version 330
in vec3 color;
out vec4 out_color;
void main() {
out_color = vec4(color, 1.0);
}
''),
ctx.buffer(vertices.astype('f4').tobytes()),
'in_pos', 'in_color',
)
# 仅用着色器渲染部分元素
vao.render(mode=moderngl.TRIANGLES, vertices=3, first=0) # 渲染所有元素
vao.program['apply_color'].value = False # 关闭着色器变量
vao.render(mode=moderngl.TRIANGLES, vertices=1, first=0) # 仅渲染第一个元素
vao.program['apply_color'].value = True # 打开着色器变量
vao.render(mode=moderngl.TRIANGLES, vertices=2, first=1) # 仅渲染后两个元素
在着色器中创建条件变量apply_color
,使用gl_VertexID
内建变量获取当前顶点ID,通过条件判断实现只对特定顶点使用着色器:
#version 330
in vec3 in_pos;
in vec3 in_color;
out vec3 color;
uniform bool apply_color;
void main() {
gl_Position = vec4(in_pos, 1.0);
color = apply_color ? in_color : vec3(1.0); // 如果apply_color为true则使用in_color,否则使用默认颜色,例如白色。
}