轮廓对象后面的透明对象
Transparent object behind outline object
我有一个轮廓对象。
我想在它后面画一个透明的物体。我的问题是轮廓与透明对象混合在一起。
如何绘制轮廓才不会混合?
# PLANE
geo1 = new THREE.PlaneGeometry 500, 500
mat1 = new THREE.MeshPhongMaterial({color: 0x00ff00, transparent: true, opacity: 0.5})
plane = new THREE.Mesh geo1, mat1
plane.position.z = -100
scene.add plane
# SHADED MODEL
torusKnotGeo = new THREE.TorusKnotGeometry 50, 10, 128, 16
phongMat2 = new THREE.MeshPhongMaterial 0xffffff
torusKnot = new THREE.Mesh torusKnotGeo, phongMat2
scene.add torusKnot
# OUTLINE
uniforms = offset:
type: "f"
value: 2
shader = shader['outline']
shaderMat = new THREE.ShaderMaterial
uniforms: uniforms,
vertexShader: shader.vertex_shader,
fragmentShader: shader.fragment_shader,
torusKnotOutline = new THREE.Mesh torusKnotGeo, shaderMat
torusKnotOutline.material.depthWrite = false
outScene.add torusKnotOutline
jsfiddle (based on )
我无法评论(没有足够的代表),所以我会 post 一个答案。
您从原始 JS fiddle: http://jsfiddle.net/Eskel/g593q/5/ 中获取了示例并删除了作曲家。作曲家在渲染过程中添加了一些额外的操作。
composer.addPass normal
composer.addPass mask
composer.addPass outline
composer.addPass clearMask
composer.addPass copyPass
- 首先渲染物体场景、轮廓场景和蒙版场景。
- 然后它制作一个遮罩,在其上呈现轮廓,然后清除该遮罩。这部分创建您的大纲,这是非常重要的一步。为什么?因为如果我使用你的代码并添加一个额外的对象,你会看到轮廓被两个对象遮住了。无论第二个对象是在场景的前面还是后面,都会发生这种情况,我相信你不想发生这种情况。示例:http://jsfiddle.net/adrian_moisa/84470k4n/1/
- 最后,它将轮廓复制到渲染的场景上。
我的建议是分叉原始示例并保持作曲家完整。如果您没有让它工作,请记住包含原始示例中的以下脚本。如果其中任何一个在操作中丢失,你的作曲家就坏了,这意味着你的页面将无法呈现。
- ShaderPass.js
- RenderPass.js
- MaskPass.js
- EffectComposer.js
- CopyShader.js
- AdditiveBlendShader.js
我有一个轮廓对象。
我想在它后面画一个透明的物体。我的问题是轮廓与透明对象混合在一起。
如何绘制轮廓才不会混合?
# PLANE
geo1 = new THREE.PlaneGeometry 500, 500
mat1 = new THREE.MeshPhongMaterial({color: 0x00ff00, transparent: true, opacity: 0.5})
plane = new THREE.Mesh geo1, mat1
plane.position.z = -100
scene.add plane
# SHADED MODEL
torusKnotGeo = new THREE.TorusKnotGeometry 50, 10, 128, 16
phongMat2 = new THREE.MeshPhongMaterial 0xffffff
torusKnot = new THREE.Mesh torusKnotGeo, phongMat2
scene.add torusKnot
# OUTLINE
uniforms = offset:
type: "f"
value: 2
shader = shader['outline']
shaderMat = new THREE.ShaderMaterial
uniforms: uniforms,
vertexShader: shader.vertex_shader,
fragmentShader: shader.fragment_shader,
torusKnotOutline = new THREE.Mesh torusKnotGeo, shaderMat
torusKnotOutline.material.depthWrite = false
outScene.add torusKnotOutline
jsfiddle (based on )
我无法评论(没有足够的代表),所以我会 post 一个答案。
您从原始 JS fiddle: http://jsfiddle.net/Eskel/g593q/5/ 中获取了示例并删除了作曲家。作曲家在渲染过程中添加了一些额外的操作。
composer.addPass normal
composer.addPass mask
composer.addPass outline
composer.addPass clearMask
composer.addPass copyPass
- 首先渲染物体场景、轮廓场景和蒙版场景。
- 然后它制作一个遮罩,在其上呈现轮廓,然后清除该遮罩。这部分创建您的大纲,这是非常重要的一步。为什么?因为如果我使用你的代码并添加一个额外的对象,你会看到轮廓被两个对象遮住了。无论第二个对象是在场景的前面还是后面,都会发生这种情况,我相信你不想发生这种情况。示例:http://jsfiddle.net/adrian_moisa/84470k4n/1/
- 最后,它将轮廓复制到渲染的场景上。
我的建议是分叉原始示例并保持作曲家完整。如果您没有让它工作,请记住包含原始示例中的以下脚本。如果其中任何一个在操作中丢失,你的作曲家就坏了,这意味着你的页面将无法呈现。
- ShaderPass.js
- RenderPass.js
- MaskPass.js
- EffectComposer.js
- CopyShader.js
- AdditiveBlendShader.js