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

顶点着色器修改无效果:缩放gl_Position未改变纹理位置的问题咨询

问题分析与修复

核心错误

你存在两个关键问题:

  1. 矩阵乘法逻辑错误:GLSL中矩阵与顶点的正确乘法顺序是矩阵 * 顶点,你当前的u_MVP * 0.5 * a_Position会先将MVP矩阵整体缩放0.5,再与顶点位置相乘,这和你想要“把最终顶点位置缩放0.5”的逻辑不符。
  2. 概念混淆:你想修改纹理位置,但操作的是gl_Position——这个变量控制的是顶点在屏幕上的显示位置,和纹理如何映射到模型上没有直接关系。纹理的映射位置是由纹理坐标(而非顶点位置)决定的。

分情况修复

若目标是缩放模型的屏幕位置(非纹理)

修正乘法顺序,确保先计算MVP矩阵与顶点的乘积,再应用缩放:

uniform mat4 u_MVP;            
attribute vec4 a_Position;     
void main()                    
{                              
    gl_Position = u_MVP * a_Position * 0.5;  
}

也可以将0.5放在前面,效果一致:0.5 * u_MVP * a_Position,这样模型会在屏幕上缩小一半,但纹理的映射方式不会改变。

若目标是改变纹理的显示位置/缩放

你需要操作纹理坐标,具体步骤如下:

  1. 修改顶点着色器,添加纹理坐标属性并传递给片元着色器:
uniform mat4 u_MVP;            
attribute vec4 a_Position;     
attribute vec2 a_TexCoord; // 新增纹理坐标输入属性
varying vec2 v_TexCoord;   // 用于传递到片元着色器的变量

void main()                    
{                              
    gl_Position = u_MVP * a_Position;  
    // 此处修改纹理坐标,示例为缩放0.5,也可添加偏移等操作
    v_TexCoord = a_TexCoord * 0.5; 
    // 纹理偏移示例:v_TexCoord = a_TexCoord + vec2(0.2, 0.3);
}
  1. 对应的片元着色器需使用修改后的纹理坐标进行采样:
uniform sampler2D u_Texture;
varying vec2 v_TexCoord;

void main() {
    gl_FragColor = texture2D(u_Texture, v_TexCoord);
}

调整后,纹理的显示位置或大小会按你的预期发生变化。

内容的提问来源于stack exchange,提问作者خلیل ترابی

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:20:31