2016-04-08 21 views
0

I araç durdurma ışıkları için bir parlaklık etkisi yaratan ve her zaman kamera karşısında mümkün kılan bir gölgelendirici buldum ediyorum:Three.js GLSL peri daima ön kamera

uniform vec3 viewVector; 
uniform float c; 
uniform float p; 
varying float intensity; 
void main() { 
    vec3 vNormal = normalize(normalMatrix * normal); 
    vec3 vNormel = normalize(normalMatrix * -viewVector); 
    intensity = pow(c - dot(vNormal, vNormel), p); 
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); 
} 

Bu çözüm oldukça basit ve neredeyse çalışır. Kamera hareketine tepki verir ve harika olur. AMA bu eleman bir arabanın çocuğu. Aracın kendisi hareket ediyor ve doğrudan kameraya bakacak şekilde duran malzeme stoplarını döndürüyor.

SpritePlugin veya LensFlarePlugin'i kullanmak istemiyorum çünkü bu oyunu 20 fps kadar yavaşlatıyorlar, böylece bu hafif çözüme sadık kalacağım.

Sana tranformation matrisinden rotasyon verileri kaldırmak zorunda Doğrudan 3d için bir çözüm buldum ama sanırım Three.js

yılında bunun nasıl bilmiyorum yerine araba dönüşümle hesaplamalar ekleme bunun yerine bu gölgelendiriciyi basitleştirmenin bir yolu olmalı.

Bu gölgelendirici, malzemenin her zaman fotoğraf makinesine bakması için nasıl basitleştirilir?

Aşağıdaki bağlantıdan: "Küresel reklamcılık yapmak için, kimlik matrisini ayarlayarak tüm dönüşleri kaldırın". THREE.js içinde ShaderMaterial nasıl yapılır? http://www.geeks3d.com/20140807/billboarding-vertex-shader-glsl/

Burada sorun, gölgelendiriciye geçmeden önce ShaderMaterial'dan dönüşüm matrisini engellemeyi düşünüyorum, ancak emin değilim.

uniform vec3 glowColor; 
varying float intensity; 
void main() { 
    vec3 glow = glowColor * intensity; 
    gl_FragColor = vec4(glow, 1.0); 
} 

düzenlemek: Burada Muhtemelen alakasız ama

da parça gölgelendirici var ben zıt quaternion ayarlayarak ebeveynin rotasyon etkisi ortadan kaldırarak bir geçici çözüm bulundu şimdilik. Mükemmel değil ve CPU'da oluyor GPU

this.quaternion._x = -this.parent.quaternion._x; 
this.quaternion._y = -this.parent.quaternion._y; 
this.quaternion._z = -this.parent.quaternion._z; 
this.quaternion._w = -this.parent.quaternion._w; 

cevap

1

Reklam panosunun uygulanmasını mı istiyorsunuz? Eğer öyleyse yapmanız gereken tüm şudur, (her zaman kamerayı karşıya 2D sprite yapmak):

"vec3 billboard(vec2 v, mat4 view){", 
    " vec3 up = vec3(view[0][1], view[1][1], view[2][1]);", 
    " vec3 right = vec3(view[0][0], view[1][0], view[2][0]);", 
    " vec3 p = right * v.x + up * v.y;", 
    " return p;", 
"}" 

v merkezi, z-eksenini yüzleri bir düzlemde temelde 4 köşeler ofset olduğunu. Örneğin. şöyle (1.0, 1.0), (1.0, -1.0), (-1.0, 1.0), and (-1.0, -1.0).

Kullanım it:

"vec3 worldPos = billboard(a_offset, u_view);" 
// then do whatever else. 
+0

Evet, billboarding aradığım şeydir. Bu gece bir şey vereceğim! – Pawel