我在碎片着色器中遇到以下错误。我很困惑,因为变量没有声明为一致的。
为了编译着色器,我使用了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’
2条答案
按热度按时间9ceoxa921#
片段着色器中的变化变量是只读的,在片段着色器中变化意味着顶点着色器可以通过此变量将不同的值传递到片段着色器,这与将获得相同值的统一变量形成对比。您需要在片段着色器main()中引入局部变量,根据需要设置其值,并使用此局部变量对纹理进行采样。
ct2axkht2#
变量是只读的。变量的定义如下-https://thebookofshaders.com/glossary/?search=varying。但只读并不意味着变量不能被复制。在此处检查内存限定符-https://www.khronos.org/opengl/wiki/Type_Qualifier_(GLSL)#Vertex_shader_i