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

Three.js如何去除渐变效果中的体素化异常?

顶点颜色绘制矩形出现体素化,无法实现平滑渐变

问题分析

你当前的实现是通过循环生成大量小矩形拼接成大矩形,每个小矩形的四个顶点都使用相同的颜色值,这就导致每个小方块颜色均匀,呈现出“体素化”的效果,而非顶点间的平滑颜色插值。

解决方案

改用单个矩形(由两个三角形组成),仅给四个顶点设置不同的目标颜色,让WebGL自动在顶点间进行颜色插值,就能实现平滑渐变效果。

修改后的核心代码示例:

// 顶点着色器
const vertexShaderSource = `
attribute vec2 a_position;
attribute vec4 a_color;
varying vec4 v_color;
void main() {
  gl_Position = vec4(a_position, 0.0, 1.0);
  v_color = a_color;
}
`;

// 片段着色器
const fragmentShaderSource = `
precision mediump float;
varying vec4 v_color;
void main() {
  gl_FragColor = v_color;
}
`;

// 单个大矩形的四个顶点位置
const positions = new Float32Array([
  -1.0, -1.0,
   1.0, -1.0,
  -1.0,  1.0,
   1.0,  1.0,
]);

// 四个顶点对应四种不同颜色,用于插值生成平滑渐变
const colors = new Float32Array([
  1.0, 0.0, 0.0, 1.0, // 左下红色
  0.0, 1.0, 0.0, 1.0, // 右下绿色
  0.0, 0.0, 1.0, 1.0, // 左上蓝色
  1.0, 1.0, 0.0, 1.0, // 右上黄色
]);

// 绘制时使用 TRIANGLE_STRIP 模式,一次绘制完成大矩形
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);

补充说明

WebGL的片段着色器会自动对顶点着色器传递的varying变量(比如示例中的v_color)进行插值计算,只要顶点颜色不同,就能在三角形内部生成自然的平滑颜色过渡。手动拆分小方块的做法会打断插值逻辑,反而造成色块化的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:35:27