end*_*rce 3 shader wireframe three.js
因为我需要透明度,每个人脸上都在自身的I从切换MeshBasicMaterial到ShaderMaterial.
我绘制了两次几何图形:首先是我填充的三角形,然后是一个线框,以获得每个三角形的边框.
有没有更好的存档方式?
有了MeshBasicMaterial它看起来罚款:

但是,如果我切换到ShaderMaterial:(不透明度减少到.3,这样你就可以看到线框)

有没有办法告诉webgl哪个着色器"先来"?
我的MeshBasicMaterial:
var material = new THREE.MeshBasicMaterial({
color: new THREE.Color(0xa5a5a5),
side: THREE.DoubleSide,
transparent: true,
opacity: .99
});
Run Code Online (Sandbox Code Playgroud)
和
var materialLines = new THREE.MeshBasicMaterial({
color: new THREE.Color(0x0),
side: THREE.DoubleSide,
wireframe: true
});
Run Code Online (Sandbox Code Playgroud)
我的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;
Run Code Online (Sandbox Code Playgroud)
和
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
});
Run Code Online (Sandbox Code Playgroud)
用我的着色器:
<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>
Run Code Online (Sandbox Code Playgroud)
编辑1:
你到底想要达到什么目的?
我想绘制一个由三角形组成的3D对象.
我想有可能控制每个三角形的透明度和颜色.
有什么要求?
用户应该看到每个三角形边缘/每个三角形周围的边框.
每个三角形表面可以具有不同的颜色(基于三个角的颜色)和alpha/transpareny值.
用户可以将每个三角形设置为不可见(不透明度= 0.0),可见(不透明度= 1.0)或介于两者之间.(仅三角形表面不是边框)
你的问题是什么?
使用黑色或任何颜色的边框绘制三角形的最佳方法是什么.
获得每个三角形透明度的最佳方法是什么(但要保持边界).
编辑 - 答案更新.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 );
Run Code Online (Sandbox Code Playgroud)
three.js r.84
| 归档时间: |
|
| 查看次数: |
3245 次 |
| 最近记录: |