我尝试将纹理应用于在运行时创建的几何体,从远程服务器读取二进制资源。 我创建了几何分配UVs(geometry.faceVertexUvs = uvs;),法线(face.vertexNormals.push(...))和切线(face.vertexTangents.push(...))。
如果我尝试使用基本材质创建网格,则没有问题,但是当我使用该几何创建网格并尝试应用我的纹理时,webgl不会显示任何几何体,我得到了这个警告:
[.WebGLRenderingContext] GL错误:GL_INVALID_OPERATION:glDrawElements:尝试访问属性1中超出范围的顶点
有人知道发生了什么吗?我认为我的几何有问题,因为如果我使用THREE.Sphere,我实际上可以应用纹理。
但是每个人都告诉我,为了应用纹理,我需要UV,而且我有。
我认为我的faceVertexUvs错了。
真正的问题是:geometry.faceVertexUvs.length应该等于geometry.vertices.length,还是应该等于geometry.faces.length?
非常感谢。
PS:我已经阅读了以下帖子
WebGL drawElements out of range?
Three JS Map Material causes WebGL Warning
THREEjs can't use the material on the JSON Model when initializing. Gives me WebGL errors
Loading a texture for a custom geometry causes “GL_INVALID_OPERATION” error
答案 0 :(得分:1)
问题解决了!!
@GuyGood:当你说每个顶点需要一个UV-Vector2时你是对的,但是说geometry.faceVertexUvs.length应该等于geometry.vertices.length ...
是错误的。 似乎facevertexUvs是一个矩阵,而不是一个数组。井,它是一个数组数组......不正确的矩阵......实际上我认为它可以用来处理多网格对象..如果facevertexUvs.length == 3,我们有3个子网格,所以3个数组......每个数组的长度都等于特定子网格的面数...每个面都知道有关定义该面的3个顶点的UV映射..希望这是明确和有用的!