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

GLSL着色器中基于压力参数调整光标纹理缩放的实现问题

解决GLSL光标压力缩放问题

以下是修改后的完整着色器代码,实现了压力控制光标缩放(pressure=1.0时缩至原尺寸50%,pressure=0.0时保持原尺寸),同时保留光标宽高比并维持居中:

// Set the precision
precision highp float;

uniform float time;                 // Time uniform variable
uniform vec2 mouse;                 // Mouse position uniform variable

uniform sampler2D cursorTex;        // Texture sampler for the cursor image
uniform sampler2D bgTex;            // Texture sampler for the background image

uniform vec2 cursorSize;            // Size of the cursor image
varying vec2 vTexCoord;             // Interpolated texture coordinates

uniform float pressure;            // Pressure applied to touchpad/ mouse


void main() {
  vec2 uv = vTexCoord.st;
  // Flip the texture coords
  uv.y = 1.0 - uv.y;

  vec2 bgSize = vec2(1080.0, 1920.0); // 背景尺寸,建议改为uniform适配不同分辨率

  // 计算缩放因子:pressure=0时1.0(原尺寸),pressure=1时0.5(缩50%)
  float scale = mix(1.0, 0.5, pressure);
  // 缩放后的光标实际显示尺寸
  vec2 scaledCursorSize = cursorSize * scale;

  // 光标中心在背景UV坐标系中的位置
  vec2 cursorCenterUV = mouse / bgSize;
  // 将当前UV转换为光标纹理的采样坐标,确保光标居中且缩放后位置不变
  vec2 cursorUV = (uv - cursorCenterUV) / (scaledCursorSize / bgSize) + 0.5;

  // 仅在光标UV合法范围内采样,避免纹理外的异常颜色
  vec4 cursorColor = vec4(0.0);
  if (cursorUV.x >= 0.0 && cursorUV.x <= 1.0 && cursorUV.y >= 0.0 && cursorUV.y <= 1.0) {
    cursorColor = texture2D(cursorTex, cursorUV);
    // 根据压力调整光标透明度(原逻辑保留,若要真正控制透明度建议修改alpha通道)
    cursorColor.rgb *= clamp(0.5 - pressure, 0.0, 1.0);
  }

  // 采样背景纹理
  vec4 bgColor = texture2D(bgTex, uv);

  // 使用alpha混合合成光标与背景,避免颜色叠加过曝
  vec4 finalColor = mix(bgColor, cursorColor, cursorColor.a);

  gl_FragColor = finalColor;
}

核心修改说明:

  • 缩放逻辑实现:用mix(1.0, 0.5, pressure)实现线性过渡的缩放因子,保证压力从0到1时,光标尺寸平滑从原大小缩至50%,且宽高比不变。
  • 光标UV坐标重构:
    1. 先计算光标中心在背景UV中的位置;
    2. 将当前UV转换为相对于光标中心的偏移,除以缩放后的尺寸比例后,再偏移0.5将原点移到光标纹理中心,确保缩放时光标始终居中于鼠标位置。
  • 合法UV判断:新增光标UV范围检查,避免采样纹理外的区域出现异常色块。
  • 混合方式优化:将原有的直接颜色加法改为alpha混合,更符合常规UI绘制逻辑,避免颜色过曝。

额外优化建议:

  • 把bgSize改为uniform变量,避免硬编码背景尺寸,适配不同分辨率的显示场景;
  • 原代码中调整透明度的逻辑是修改RGB通道,若实际需求是控制光标透明度,建议改为修改cursorColor.a,例如:cursorColor.a *= clamp(0.5 - pressure, 0.0, 1.0);,更符合透明度控制的常规做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 23:33:18