Three.js:在ShaderMaterial后面渲染线框

时间:2014-01-19 17:18:29

标签: three.js shader wireframe

因为我自己需要每张脸的透明度,所以我从MeshBasicMaterial切换到ShaderMaterial

我画了两次几何图形: 首先是我的三重奏 然后是一个线框,以获得每个三角形的边框 有没有更好的存档方式?

使用MeshBasicMaterial看起来不错: Render with MeshBasicMaterial

但是,如果我切换到ShaderMaterial :(不透明度减少到.3,以便您可以看到线框) Render with ShaderMaterial

有没有办法告诉webgl哪个着色器“先来”?

我的MeshBasicMaterial

var material = new THREE.MeshBasicMaterial({
   color: new THREE.Color(0xa5a5a5),
   side: THREE.DoubleSide,
   transparent: true,
   opacity: .99
});

var materialLines = new THREE.MeshBasicMaterial({
   color: new THREE.Color(0x0),
   side: THREE.DoubleSide,
   wireframe: true
});

我的ShaderMaterial

var attributes = {
   customColor: {    type: 'c', value: [] },
   customOpacity: { type: 'f', value: []}
};
var shaderMaterial = new THREE.ShaderMaterial({
   attributes: attributes,
   vertexShader: document.getElementById('vertexshader').textContent,
   fragmentShader: document.getElementById('fragmentshader').textContent,
   blending: THREE.NormalBlending,
   depthTest: false,
   transparent: true,
   side: THREE.DoubleSide
});
shaderMaterial.linewidth = 5;

var uniforms = {
   color: { type: "c", value: new THREE.Color(0x0) }
};
var ShaderMaterialLines = new THREE.ShaderMaterial({
   uniforms: uniforms,
   vertexShader: document.getElementById('vertexshaderline').textContent,
   fragmentShader: document.getElementById('fragmentshaderline').textContent,
   depthTest: false,
   side: THREE.DoubleSide,
   wireframe: true
});

使用我的着色器:

<script type="x-shader/x-vertex" id="vertexshader">
    attribute vec3 customColor;
    attribute float customOpacity;

    varying vec3 vColor;
    varying float vOpacity;

    void main() {
        vColor = customColor;
        vOpacity = customOpacity;
        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
    }
</script>
<script type="x-shader/x-fragment" id="fragmentshader">
    varying vec3 vColor;
    varying float vOpacity;

    void main() {
        gl_FragColor = vec4( vColor, vOpacity);
    }
</script>
<script type="x-shader/x-vertex" id="vertexshaderline">
    uniform vec3 color;

    varying vec3 vColor;

    void main() {
        vColor = color;
        gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
    }
</script>
<script type="x-shader/x-fragment" id="fragmentshaderline">
    varying vec3 vColor;

    void main() {
        gl_FragColor =  vec4( vColor, 1.0);
    }
</script>

修改1:

你到底想要实现什么目标?
我想绘制一个由三角形组成的3D对象 我想有可能控制每个三角形的透明度和颜色。

有什么要求?
用户应该看到每个三角形边缘/每个三角形周围的边框 每个三角形表面可以具有不同的颜色(基于三个角的颜色)和alpha / transpareny值 用户可以将每个三角形设置为不可见(不透明度= 0.0),可见(不透明度= 1.0)或介于两者之间。(仅三角形表面不是边框)

你的问题是什么?
使用黑色或任何颜色的边框绘制三角形的最佳方法是什么 获得每个三角形透明度的最佳方法是什么(但要保持边界)。

1 个答案:

答案 0 :(得分:7)

编辑 - 答案已更新。 WireframeHelper已被弃用。


您希望网格具有透明材质和线框。

要渲染每个三角形周围的边框,请使用WireframeGeometry,并确保网格材质为transparent = true

透明对象最后呈现,因此整个线框将显示。

var mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

// wireframe
var geometry2 = new THREE.WireframeGeometry( geometry ); // or EdgesGeometry
var material2 = new THREE.LineBasicMaterial( { color: 0x000000, transparent: true } );
var wireframe = new THREE.LineSegments( geometry2, material2 );
mesh.add( wireframe );

three.js r.84