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

WebGL三角形模式下如何获取形状内片元坐标?gl_FragCoord无效

解决WebGL同一绘制调用实现带边框矩形的问题

核心思路:用顶点传递局部UV坐标替代gl_FragCoord

gl_FragCoord是屏幕空间坐标,和你绘制的矩形局部位置无关,所以在TRIANGLES模式下无法直接用来构建矩形的[0,1]局部空间。正确的做法是给每个顶点绑定对应的局部UV坐标,传递到片元着色器使用。


1. 顶点着色器实现

给每个顶点添加UV属性,将矩形的左上角对应(0.0, 0.0),右下角对应(1.0, 1.0),并把UV传递给片元着色器:

attribute vec2 a_position;
attribute vec2 a_uv;
uniform mat4 u_mvp;
varying vec2 v_uv;

void main() {
  gl_Position = u_mvp * vec4(a_position, 0.0, 1.0);
  v_uv = a_uv;
}

2. 片元着色器实现边框+实心填充

基于传递来的v_uv(范围[0,1]),用smoothstep实现抗锯齿的边框效果:

precision mediump float;
uniform float u_borderWidth; // UV空间的边框宽度,范围0~0.5
uniform vec4 u_fillColor;
uniform vec4 u_borderColor;
varying vec2 v_uv;

void main() {
  // 计算当前像素到矩形最近边缘的距离
  float edgeDist = min(
    min(v_uv.x, 1.0 - v_uv.x),
    min(v_uv.y, 1.0 - v_uv.y)
  );
  
  // smoothstep实现平滑过渡:距离小于borderWidth时显示边框色,否则显示填充色
  float mixFactor = smoothstep(u_borderWidth - 0.002, u_borderWidth, edgeDist);
  gl_FragColor = mix(u_borderColor, u_fillColor, mixFactor);
}

3. 绘制时的顶点数据准备

用TRIANGLES模式绘制矩形需要6个顶点(两个三角形),对应的位置和UV数据示例:

// 顶点位置(假设是标准化设备坐标,可根据MVP矩阵调整)
const positions = [
  -0.5, 0.5,   // 左上
  -0.5, -0.5,  // 左下
  0.5, 0.5,    // 右上
  0.5, 0.5,    // 右上
  -0.5, -0.5,  // 左下
  0.5, -0.5    // 右下
];

// 对应UV数据
const uvs = [
  0.0, 0.0,
  0.0, 1.0,
  1.0, 0.0,
  1.0, 0.0,
  0.0, 1.0,
  1.0, 1.0
];

关键注意点

  • 如果需要固定像素宽度的边框,不要直接传像素值,要转换成UV空间比例:uvBorderWidth = pixelBorder / rectSideLength(比如矩形宽200px,边框2px,那么uvBorderWidth=2/200=0.01)
  • u_borderWidth的有效范围是0到0.5,超过0.5会导致边框覆盖整个矩形

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:10:25