2017-06-09 10 views
0

私はメッシュのテクスチャにフィルタを提供するために、MeshBasicMaterialからShaderMaterialに切り替えています。 ShaderMaterialはMaterialから継承されるため、不透明度パラメータが存在します。しかし、このパラメータを変更しても、オブジェクトの不透明度は変わりません。私は、アルファ値を設定しないTHREE.HueSaturationShaderを使用しています。THREE.ShaderMaterial不透明ではない

私は状況を示すために非常に簡単なフィドルを追加しました
http://jsfiddle.net/thenectorgod/89aahytL/1/

// BufferGeometry Tester 

var hostDiv, scene, renderer, camera; 

var WIDTH = 500;//window.innerWidth, 
HEIGHT = 500;//window.innerHeight, 
FOV = 35, 
NEAR = 1, 
FAR = 1000; 

function init() { 
hostDiv = document.createElement('div'); 
document.body.appendChild(hostDiv); 

scene = new THREE.Scene(); 

renderer = new THREE.WebGLRenderer({ antialias: true }); 
renderer.setSize(WIDTH, HEIGHT); 
renderer.setClearColor(0x888888, 1); 
hostDiv.appendChild(renderer.domElement); 

camera = new THREE.PerspectiveCamera(FOV, WIDTH/HEIGHT, NEAR, FAR); 
camera.position.z = 50; 
camera.lookAt(scene.position); 
var geometry = new THREE.PlaneBufferGeometry(20,20); 
var material = new THREE.ShaderMaterial({ 
    transparent: true, 
    depthTest: false 
}); 
material.opacity = 0; 
var mesh = new THREE.Mesh(geometry, material); 
scene.add(mesh); 
scene.add(camera); 
animate(); 
} 

function render() { 
renderer.render(scene, camera); 
} 

function animate() { 
requestAnimationFrame(animate); 
render(); 
} 

init(); 

不透明度を0に設定しても、オブジェクトは引き続き表示されます。

どのようにして不透明度パラメータとシェーダパラメータを追加しなくても、両方を使うことができますか?

答えて

1

シェーダの素材にシェーダがありません。デフォルトでは、MeshBasicMaterialのようなものがレンダリングされますが、ハードコードされたGLSLの色は赤で、透明度/不透明度はありません。

ShaderMaterialが必要な場合、実際にはShaderMaterialを書き込む必要があります。

+0

私はTHREE.HueSaturationシェーダを私のプログラムのシェーダとして使用しています。均一なパラメータとして不透明度を取らないシェーダがたくさんあります。そのような場合、どのように不透明度を設定しますか?また、複数のシェーダパスを追加するシステムはありません。では、すべてのシェーダを不透明度を含むように変更する必要がありますか? –

+0

はい。そのシェーダの 'gl_FragColor'に書かれているものは、スクリーン(またはテクスチャ)で終わるものです。 'gl_FragColor.w == 1.0'ならば、透明が真であっても不透明はありません。残念ながら、複数のシェーダパスを追加するシステムはありませんが、 'onBeforeRender'を見ることができます。そのプルリクエストを行う際には、文字通りそのユースケースを念頭に置いています。オブジェクトをレンダリングすると、別のシェーダを使用してオブジェクトをレンダリングします。 – pailhead