You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ModernGL设置uniform异常:动态三角形无显示问题求助

解决ModernGL中看不到动画三角形的问题

我帮你找出了代码里的几个关键问题,修正后就能看到动起来的蓝色三角形了:

问题分析与修复步骤

1. 缺少帧缓冲区清除操作

在每次渲染前,你需要清除颜色缓冲区——窗口的初始缓冲区内容是未定义的(通常是黑色或随机噪点),如果不清除,新渲染的三角形会被旧内容覆盖或无法正常显示。在渲染循环的最开头加上:

context.clear()

2. 没有在循环中更新time Uniform

你只在初始化时给time赋值了1.0,之后再也没更新过它:这意味着三角形的y坐标会固定在sin(1.0)的位置,就算能看到它,也不会有动画效果。在渲染循环里,你需要把当前实时时间传给这个uniform,还可以乘以一个系数放慢动画速度:

program["time"].value = time.time() * 0.5

3. (可选)移除无用代码

你的代码里计算了elapsed但没有使用,这个变量可以直接删掉,不影响功能。

修正后的完整代码

import moderngl as mgl
import glfw
import numpy as np
import time
from math import sin

glfw.init()
glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3)
glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3)
glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
window = glfw.create_window(800, 600, "Animated Triangle", None, None)
glfw.make_context_current(window)
context = mgl.create_context()

vertex_source = """
#version 330 core
in vec2 aPos;
uniform float time;
void main() {
    gl_Position = vec4(aPos.x, aPos.y + sin(time), 0.0, 1.0);
}
"""

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

program = context.program(vertex_shader=vertex_source, fragment_shader=fragment_source)
data = np.array([
    0.5, 0,
    -0.5, 0,
    0, 0.5], dtype = "float32")
vbo = context.buffer(data.tobytes())
vao = context.vertex_array(program, vbo, "aPos")

while not glfw.window_should_close(window):
    # 清除颜色缓冲区,确保每次渲染都有干净的背景
    context.clear()
    # 实时更新time uniform,驱动三角形动画
    program["time"].value = time.time() * 0.5
    # 渲染三角形
    vao.render()
    
    glfw.poll_events()
    glfw.swap_buffers(window)

glfw.terminate()

为什么这些修改有效?

  • context.clear()会把窗口缓冲区重置为默认黑色(你也可以通过参数指定自定义背景色,比如context.clear(0.1, 0.1, 0.1)),让新渲染的三角形能清晰显示。
  • 实时更新time uniform后,顶点着色器里的sin(time)会持续变化,带动三角形的y坐标上下移动,实现预期的动画效果。

内容的提问来源于stack exchange,提问作者Parashoo

火山引擎 最新活动