2012-12-03 21 views
2

我有一个基于tileset的项目,我目前通过许多ShaderMaterials将其映射到CubeGeometries。three.js将几何体与ShaderMaterials合并

当渲染立方体时,立方体边缘会出现流血和闪烁现象。另外,它在性能方面似乎是一种非常糟糕的方式。

所以我抬头THREE.GeometryUtils.merge,显然我的合并对立方体一个几何,顶点和所有。

是否可以使合并网格保留每个立方体上使用的材料? 有没有更好的方法来完成我想要做的事情?

编辑: 这是一个什么不工作的例子。

http://jsfiddle.net/CpQ77/3/

var shaderMat1 = new THREE.ShaderMaterial({ 
    fragmentShader: document.getElementById("red-fragment").innerText, 
    vertexShader: document.getElementById("vertex").innerText 
}); 
var shaderMat2 = new THREE.ShaderMaterial({ 
    fragmentShader: document.getElementById("blue-fragment").innerText, 
    vertexShader: document.getElementById("vertex").innerText 
}); 

var cube1 = new THREE.Mesh(new THREE.CubeGeometry(64, 64, 64), new THREE.MeshFaceMaterial([shaderMat1, shaderMat1, shaderMat1, shaderMat1, shaderMat1, shaderMat1])); 
cube1.position.x = 0; 
cube1.position.y = 300; 

var cube2 = new THREE.Mesh(new THREE.CubeGeometry(64, 64, 64), new THREE.MeshFaceMaterial([shaderMat2, shaderMat2, shaderMat2, shaderMat2, shaderMat2, shaderMat2])); 
cube2.position.x = 64; 
cube2.position.y = 300; 

var geo = new THREE.Geometry(); 
THREE.GeometryUtils.merge(geo, cube1); 
THREE.GeometryUtils.merge(geo, cube2); 

var mergedMesh = new THREE.Mesh(geo, new THREE.MeshFaceMaterial()); 

scene.add(mergedMesh); 

它给出了一个错误的说法,“遗漏的类型错误:无法读取的未定义的属性‘地图’”,试图利用MeshFaceMaterial作为一对夫妇的网络上的地方使用时。

虽然我找不到我想念的东西。

EDIT2: 一个解决办法,我发现是通过新的几何形状的所有面圈,并呼吁geometry.mergeVertices前进行materialIndex它()。

+0

什么版本的库您使用的是? – WestLangley

+0

我正在使用rev53 – lindell

+0

小提琴是r50。请参阅https://github.com/mrdoob/three.js/wiki/Migration。材料不再是几何体的一部分。查看几何合并源代码,并在出现错误时报告错误。我不确定此时适当的行为应该是什么。 – WestLangley

回答

0

感谢这篇文章,评论有助于寻找解决方案。您应该将它作为MeshFaceMaterial的唯一参数,而不是将材质数组提供给几何体。

例中的CoffeeScript:

materials = [] 
for i in [0...6] 
    texture = window["texture_" + i] # This is a Texture that has already been loaded 
    materials.push new THREE.MeshBasicMaterial(
     color : color 
     map  : texture 
    ) 
size = 1 
geometry = new THREE.CubeGeometry size, size, size 
cube = new THREE.Mesh geometry, new THREE.MeshFaceMaterial materials 
cube.position.x = x 
cube.position.y = y 
cube.position.z = z 
scene.add cube 
return cube