GLSL片段着色器报assignment to read-only variable错误且变量未声明uniform
问题产生原因
在SFML默认使用的旧版兼容GLSL规范中,varying类型变量的定位是顶点着色器到片段着色器的插值传递变量:
- 顶点着色器中可对
varying变量执行写入操作 - 片段着色器中拿到的是光栅化阶段插值完成的最终值,属于只读变量,禁止直接赋值修改
你触发报错的原因是在片段着色器中直接对varying类型的vTexCoord执行了+=赋值操作,和该变量是否为uniform类型无关。
解决方法
不要直接修改传入的varying变量,声明一个本地临时变量存储修改后的纹理坐标即可,修改后的片段着色器代码如下:
varying vec4 vColor; varying vec2 vTexCoord; uniform sampler2D uTexture; uniform float uTime; void main() { float coef = sin(gl_FragCoord.y * 0.1 + 1.0 * uTime); // 声明本地临时变量存储偏移后的纹理坐标 vec2 offsetTexCoord = vTexCoord; offsetTexCoord.y += coef * 0.03; gl_FragColor = vColor * texture2D(uTexture, offsetTexCoord); }
内容的提问来源于stack exchange,提问作者user16484137
相关产品推荐
相关产品推荐

