首页 > 解决方案 > 当变量未声明为统一时,编译错误显示“赋值给只读变量”

问题描述

我在片段着色器中收到以下错误。我很困惑,因为变量没有被声明为统一的。

为了编译着色器,我使用了 SFML 的loadFromFile()函数。

我的.frag着色器

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);
    vTexCoord.y += coef * 0.03;
    gl_FragColor = vColor * texture2D(uTexture, vTexCoord);

我的.vert着色器

varying vec4 vColor;
varying vec2 vTexCoord;

void main() {

    vColor = gl_Color;
    vTexCoord = (gl_TextureMatrix[0] * gl_MultiTexCoord0).xy;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

错误信息:

0:10(2):错误:分配给只读变量“vTexCoord”

标签: openglglslsfml

解决方案


片段着色器中的可变变量是只读的,片段着色器中的可变变量意味着顶点着色器可以通过该变量将不同的值传递给片段着色器,而统一 var 将获得相同的值。您需要在片段着色器 main() 中引入一个局部变量,根据需要设置其值并使用此局部变量对纹理进行采样。


推荐阅读