当变量未被统一声明时,编译错误显示‘赋值给只读变量’

hjqgdpho  于 2022-09-26  发布在  其他
关注(0)|答案(2)|浏览(165)

我在碎片着色器中遇到以下错误。我很困惑,因为变量没有声明为一致的。

为了编译着色器,我使用了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’

9ceoxa92

9ceoxa921#

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

ct2axkht

ct2axkht2#

变量是只读的。变量的定义如下-https://thebookofshaders.com/glossary/?search=varying。但只读并不意味着变量不能被复制。在此处检查内存限定符-https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Vertex_shader_i

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 c = vTexCoord; // assigned co-ordinates to a new variable here
    c.y += coef * 0.03;
    gl_FragColor = vColor * texture2D(uTexture, c); // implemented new variable here

相关问题