我正在尝试计算GLSL中高度贴图的曲面法线。我基本上复制了来自SO答案here的代码,只需稍加修改即可匹配我的代码:
77: float s01 = textureOffset(uTexture, uv, off.xy).x;
78: float s21 = textureOffset(uTexture, uv, off.zy).x;
79: float s10 = textureOffset(uTexture, uv, off.yx).x;
80: float s12 = textureOffset(uTexture, uv, off.yz).x;
81: vec3 va = normalize(vec3(size.xy, s21-s01));
82: vec3 vb = normalize(vec3(size.yx, s12-s10));
83: vec3 vNormal = cross(va,vb);
其中
uniform sampler2D uTexture;
attribute vec2 uv;
const vec2 size = vec2(2.0, 0.0);
const ivec3 off = ivec3(-1, 0, 1);
问题是编译器返回错误:
THREE.WebGLProgram: shader error: 0 gl.VALIDATE_STATUS false gl.getProgramInfoLog invalid shaders ERROR: 0:77: 'textureOffset' : no matching overloaded function found
ERROR: 0:77: 'x' : field selection requires structure or vector on left hand side
ERROR: 0:78: 'textureOffset' : no matching overloaded function found
ERROR: 0:78: 'x' : field selection requires structure or vector on left hand side
ERROR: 0:79: 'textureOffset' : no matching overloaded function found
ERROR: 0:79: 'x' : field selection requires structure or vector on left hand side
ERROR: 0:80: 'textureOffset' : no matching overloaded function found
ERROR: 0:80: 'x' : field selection requires structure or vector on left hand side
编译器显然选择了textureOffset的错误重载,但是查看规范here,它看起来应该可以正常工作。那么......我错过了什么?我还在研究,但是对于GLSL新手的任何提示都会受到赞赏。 TIA。
注意:这是在OSX上使用three.js r85
答案 0 :(得分:2)
查看webgl 1.0着色器的规范明确限制为不包含textureOffset的着色器glsl规范Es 1.0。
WebGL 2.0可以使用包含textureOffset的ES 3.0着色器。
即。您要遵守的限制是由Webgl 1.0规范强制执行的,而不是浏览器/ three.js / platform错误。