2016-05-12 8 views
0

Ich bin mir nicht sicher, ob das möglich ist, aber ich dachte, es lohnt sich zu fragen: Gibt es ein Feature, eine Option oder einen Shader, mit dem Sprites Schatten werfen und empfangen können? Auch der Alphakanal dieses Sprites wird nicht als Schatten dargestellt.three.js: Wie lassen sich transparente Png-Sprites werfen und Schatten empfangen?

Ich habe alle meine Assets als transparente PNGs, und ich verwende Sprites in threw.js, um die Texturen auf Sprites abzubilden. Dies funktioniert gut, abgesehen von dem Problem der Schatten. Im Idealfall wäre es gut, wenn der vom Sprite geworfene Schatten nicht den Alphakanal * der PNG enthält, so daß das Licht den Alphakanal des PNG durchläuft, obwohl ich in den Dokumentationen von dreien wenig darüber nachforsche.

Vielleicht ist dies nicht möglich unter drei oder überhaupt, was verständlich ist, aber danke im fortgeschrittenen.

* Ich denke an einen ähnlichen Stil wie PaRappa the Rapper oder Adventure Xpress.

Antwort

1

Dies sind die Shadern ich am Ende mit.

Fragment Shader. Sie können das Pixel.a ändern, welches der Alpha-Wert des Pixels ist. Der Fragment-Shader wird auf diesem Pixel verworfen, wenn der Alpha-Wert unter 0,5 fällt (wodurch er transparent erscheint).

#include <packing> 

uniform sampler2D texture; 
varying vec2 vUV; 

void main() { 

    vec4 pixel = texture2D(texture, vUV); 
    if (pixel.a < 0.5) discard; 
    gl_FragData[ 0 ] = packDepthToRGBA(gl_FragCoord.z); 

} 

Vertex-Shader. Das ist nichts besonderes, ich dachte, ich würde das hier lassen, nur wenn dein Vertex-Shader Probleme verursacht, kann ich bestätigen, dass er mit dem obigen Fragment-Shader kompatibel ist.

varying vec2 vUV; 

void main() { 

    vUV = uv; 
    vec4 mvPosition = modelViewMatrix * vec4(position, 1); 
    gl_Position = projectionMatrix * mvPosition; 

} 
1

Sprites in three.js werfen keine Schatten.

Ein Work-around ist PlaneBufferGeometry zu verwenden und sie halten die Kamera wie so gegenüber:

scene.add(plane); 

dann in der Schleife machen,

plane.lookAt(camera.position); 

Wenn Sie das Flugzeug nicht zu werfen Wenn die Textur des Flugzeugs transparent ist, müssen Sie ein benutzerdefiniertes Tiefenmaterial erstellen. Ein Beispiel dafür ist in this three.js Beispiel zu sehen.

Ohne ein benutzerdefiniertes Tiefenmaterial zu erstellen, erscheint die Ebene vom Standpunkt des Lichts aus massiv.

three.js r.76

+0

Danke für die tolle Information! Ich möchte jedoch nicht, dass jedes Flugzeug der Kamera gegenübersteht. Siehe diese Referenz: http://i.imgur.com/fzjmvg5.png. (Ich benutze deinen Ratschlag und erstelle die Objekte mit 'PlaneBufferGeometry' Ich kann die Bilder erstellen und habe sie mit Transparenz, also danke, alles was im Referenzbild fehlt sind Schatten). Ist es notwendig "LookAt" zu verwenden? – bitten

+0

Verwenden Sie 'lookAt()' nur, wenn Sie möchten. – WestLangley

+0

Vielen Dank. Also schaue ich mir 'view-source: http: // threejs.org/examples/webgl_animation_cloth.html' an und gebe meinen Meshes (aus' PlaneBufferGeometry' und 'MeshPhongMaterial') ein' customDepthMaterial', sogar mit dem Code aus dem Beispiel und ich sehe immer noch keine Schatten. Ich fügte einen Würfel in meine Szene ein, um zu zeigen, dass ich Lichter habe, und wie du sehen kannst, werden die Schatten aus dem Würfel geworfen, aber nicht meine PBGs: http://i.imgur.com/jAeWhRJ.png. Ich verwende wirklich den gleichen Code aus dem Beispiel, einschließlich der Vertex- und Fragment-Shader und des gesamten Code, der mit dem Stoff zu tun hat. – bitten

Verwandte Themen