材质贴图错误:glDrawElements:尝试访问属性2中的范围顶点

时间:2015-07-20 15:24:05

标签: javascript three.js

我有一个算法,允许用户输入数据或函数,然后绘制函数图形。基本上,它是一个表面地图just like here。图形工作正常。但是,我想添加一个映射,以添加黑点,从点到点,就像在示例中一样。但是,我一直得到标准错误:GL_INVALID_OPERATION:glDrawElements:尝试访问属性2中的范围顶点。我知道这个错误意味着我试图绘制超出缓冲区范围的东西,但是我我不知道我在做什么。我已经确认用于映射的x和y长度的变量确实是x和y索引的数量。例如,我将重复设置为76和76,对于具有76个条目和76个条目的网格,因此5776个点。

在这个例子中,他们使用参数几何,我必须使用标准的THREE.Geometry,因为我有时会接收数据而不是函数。除此之外,我已经按照示例继续得到错误。我可能会对纹理上重复所需的映射数字感到困惑。我相信它们应该代表X和Y点的数量,也许它应该是别的东西。

以下是我设置网格的方法:

Surface.prototype.setMeshes =function(DataID, callback)
{   var graphMesh={};
    var PlotID=this.Format_id;
    if (PlotID['Chart_dataobj'][DataID]['type']=="Surface")
    {   if (PlotID['Chart_dataobj'][DataID]['sWireFrame']=="Solid")
        {       
            var wireTexture = new THREE.ImageUtils.loadTexture( 'http://www.cadwolf.com/Images/square.png' );
            wireTexture.wrapS = wireTexture.wrapT = THREE.RepeatWrapping; 
            wireTexture.repeat.set( parseInt(PlotID['Chart_dataobj'][DataID].xLength), parseInt(PlotID['Chart_dataobj'][DataID].yLength) );
            wireMaterial = new THREE.MeshBasicMaterial( { map: wireTexture, vertexColors: THREE.VertexColors, side:THREE.DoubleSide } );
            wireMaterial.map.repeat.set( parseInt(PlotID['Chart_dataobj'][DataID].xLength), parseInt(PlotID['Chart_dataobj'][DataID].yLength) );
            graphMesh = new THREE.Mesh( window[PlotID]['Chart_dataobj'][DataID].surfaceGeometry, wireMaterial );            
            graphMesh.doubleSided = true;                                                       
        }
    }
    graphMesh.id = DataID;
    graphMesh.name = DataID;
    window[PlotID].Scene.add(graphMesh);
    if (typeof(callback)=="function") { callback(); }
}

我知道表面几何形状的一切都是正确的,只有一个错误,我所拥有的元素数量与重复的数字相匹配。此外,如果有人知道属性2是什么,那将是有帮助的。

由于

1 个答案:

答案 0 :(得分:0)

检查几何体以查看是否定义了UV。如果没有,那么缺少UV可能是您的错误消息的原因。

如果网格的几何体缺少UV,则网格不能应用纹理。

对于THREE.Geometry,在属性faceVertexUVs中指定了UV。

对于THREE.BufferGeometry,UV被指定为几何属性。

three.js r.71

相关问题