【问题标题】:Compile error says 'assignment to read-only variable' when variable was not declared uniform当变量未声明为统一时,编译错误显示“赋值给只读变量”
【发布时间】:2021-07-20 00:15:35
【问题描述】:

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

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

【问题讨论】:

  • 它可能来自void main()main 函数返回 int。总是。
  • 感谢您的反馈,但我不明白这两者之间有什么关系。同样从我看到的所有示例中,在 GLSL 中,main 被声明为 void。
  • @ThomasMatthews 我相信void main() 是着色器的正确签名。
  • @ThomasMatthews 在 C++ 中,当然,但不是在 GLSL 中。

标签: opengl glsl sfml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2016-01-30
    • 2016-05-04
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多