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坐标重构:
- 先计算光标中心在背景UV中的位置;
- 将当前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
相关产品推荐
相关产品推荐

