【发布时间】:2014-11-28 17:52:12
【问题描述】:
我想重现使用THREE.EdgesHelper(在“硬”对象边缘上绘制边界)创建的效果,但使用自定义着色器而不是添加单独的THREE.Line 对象。本质上,我想做this demo 中所做的事情,但仅限于“硬”边界;例如不在两个共面面之间的边界
方法:将类似的例程应用于EdgesHelper,但使用自定义属性标记硬边中的顶点(例如isEdge);可能需要使用BufferGeometry,因为常规Geometry 允许在多个面中重复使用顶点,但BufferGeometry 重复顶点,使得每个顶点仅是一个面的一部分(至少,这是我的理解;文档不明确)。
目前的进展:
- 再现了线框材质示例中的效果,但使用
BufferGeometry:http://jsfiddle.net/ogav6o77/ - 将
EdgesHelper的逻辑移植到与BufferGeometry一起使用的“BufferEdgesHelper”函数(但仍使用它来创建THREE.Line):http://jsfiddle.net/L2aertya/ - 尝试调整
BufferEdgesHelper以将其结果保存在自定义属性 (isEdge) 中,然后在决定是否渲染边缘时在自定义着色器中读取该属性:http://jsfiddle.net/4tf4c6sf/
前两个小提琴按预期工作,显示 (1) 着色器渲染的白色线框边缘,然后 (2) 着色器的白色边缘加上 Line 的红色“硬”边缘。但是,(3) 给出的结果与(2) 相同,而不是使用isEdge 属性来决定是否画线;我不明白为什么会这样。
知道如何解决这个问题,以便 仅 硬边缘由着色器渲染(例如,红线和白线重叠)?
谢谢!
【问题讨论】:
-
你是怎么做到的?