You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGL技术问题:如何固定大白色圆形尺寸,仅让小圆形动画放大

修复方案

问题根源

你的顶点着色器里的u_SizeChange uniform是全局生效的——一旦调用draw_growing_circle设置了这个值,后续所有绘制的图形(包括白色大圆)都会应用这个缩放因子,这就是大圆跟着放大的原因。WebGL的uniform状态会持续保留,直到被重新修改,所以必须在绘制不同需求的图形时,显式重置对应的状态。

具体修复步骤

1. 给固定大小的大圆重置缩放因子

在draw_circle函数中,添加一行代码将u_SizeChange设为固定值1.0,确保大圆不受缩放影响:

function draw_circle() {
  // 原有代码:设置大圆的位置、颜色等属性
  // 新增:强制将缩放因子重置为1,消除之前小圆缩放的影响
  gl.uniform1f(u_SizeChange, 1.0);
  // 执行大圆的绘制
  gl.drawArrays(gl.POINTS, ...);
}

2. (可选)优化着色器逻辑,区分缩放开关

如果想让逻辑更清晰,可以给顶点着色器加一个开关uniform,控制是否应用缩放:

attribute vec4 a_Position;
uniform float u_SizeChange;
uniform bool u_ApplyScale; // 新增开关,标记是否启用缩放

void main() {
  gl_Position = a_Position;
  // 仅在开关开启时应用缩放
  if(u_ApplyScale) {
    gl_PointSize = gl_PointSize * u_SizeChange;
  }
}

然后在绘制时:

  • 画小圆前设置u_ApplyScale = true,并传入currentSize
  • 画大圆前设置u_ApplyScale = false,彻底屏蔽缩放逻辑

3. 避免WebGL状态污染

WebGL的所有渲染状态(包括uniform、顶点属性、着色器程序)都是全局的,绘制不同图形前一定要重置相关状态。比如如果你的绘制顺序是先画小圆再画大圆,必须在画大圆前覆盖掉小圆的缩放设置;如果先画大圆再画小圆,小圆的缩放不会影响已绘制的大圆,但显式设置状态依然是更稳妥的习惯。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:10:17