我在使用in
传递的内置顶点索引的gl_VertexID遇到问题时使用了Three.js
我不知道为什么,因为文档说它适用于所有版本的OpenGL
http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_VertexID.xml
我正在使用此顶点着色器:
uniform int freqData[64];
uniform int fftSize;
in int gl_VertexID;
void main() {
vec3 norm = normalize(position);
int modFFT = mod(gl_VertexID, fftSize);
vec3 newPosition = norm * float(freqData[modFFT]);
gl_Position = projectionMatrix * modelViewMatrix * vec4( newPosition, 1.0 );
}
我收到的错误是:
ERROR: 0:68: 'in' : syntax error
in
声明似乎有问题,并且它没有抱怨任何其他内容(错误控制台能够检测到多个编译错误)。
我非常感谢你的帮助,我正在使用昨天的Three.js版本。
答案 0 :(得分:7)
首先,没有必要声明gl_VertexID
;它是否存在(由于扩展,因为基于OpenGL ES 2.0构建的WebGL不提供此作为核心功能),或者它不是。
其次,基于OpenGL ES 2.0构建的WebGL不使用in
和out
语法;这是桌面 OpenGL 3.0及更高版本。 GLSL ES使用较旧的attribute
语法。因此,即使您需要声明gl_VertexID
(同样,您也不需要),您需要将其称为attribute
,而不是in
。
答案 1 :(得分:7)
据我所知,在WebGL中你无法访问内置的顶点索引。
但是,您应该能够通过提供自己的自定义属性流来模拟这一点,并将其设置为与此类内置索引流等效的值。
在three.js中还没有实现整数自定义属性,因此您需要使用float属性。
在此示例中检查“displacement”属性:
http://mrdoob.github.com/three.js/examples/webgl_custom_attributes.html