2013-03-27 3 views
1

Мне нужно создать статический свет (инвариантный для перемещения камеры), и мне нужно получить фактическое положение света в фрагментном шейдере.Свет Three.js не является статическим

Что я делаю сейчас:

 scene = new THREE.Scene(); 
     camera = new THREE.PerspectiveCamera(60, canvas.width()/canvas.height(), 1, 10000); 
     camera.position.z = 2000; 
     camera.lookAt(0, 0, 0); 

     var light = new THREE.SpotLight(0xFFFFFF, 1); 
     light.position.set(0.5, 0.5, 0.1).normalize(); 
     camera.add(light); 

     .... 

     var lambertShader = THREE.ShaderLib['lambert']; 
     uniformsVolume = THREE.UniformsUtils.clone(lambertShader.uniforms); 

     .... 

     materialVolumeRendering = new THREE.ShaderMaterial({ 
      uniforms: uniformsVolume, 
      vertexColors: THREE.VertexColors, 
      vertexShader: vertVolumeRendering, 
      fragmentShader: fragVolumeRendering, 
      vertexColors: THREE.VertexColors, 
      lights :true 
     }); 

     .... 
     scene.add(camera); 

чем в пиксельном шейдер я установить единообразный переменную:

uniform vec3 spotLightPosition; 

и вычислить свет для вокселя:

float dProd = max(0.0, dot(getGradient(posInCube), normalize(lightPos 
- posInCube)));    
voxelColored.rgb = voxelColored.rgb * dProd + voxelColored.rgb * 0.2; 

Проблема заключается в том, что он не работает правильно. Моя идея в том, что я буду перемещаться с объектом (на самом деле с камерой). Свет будет светить с той же стороны (будет статичным в сцене). В это время свет не статичен и работает очень странно.

Любая идея? Кому-то пожалуйста ...

Танки много. Томаш

ответ

1

Попробуйте с PointLight вместо этого. SpotLight немного сложнее в использовании.

+0

Я попытался PointLight, это лучше, но не хорошо. Я делаю сейчас: float dProd = max (0.0, dot (getGradient (posInCube), normalize (normalize (pointLightPosition) - normalize (posInCube)); \t voxelColored.rgb = voxelColored.rgb * dProd + voxelColored.rgb * 0.2; – Xrew

+0

Я noob ... я нашел решение. Положения Voxel в кубе werent в мировом пространстве: - [ou .. . :( – Xrew

0

Для того, чтобы свет ваш статический в положении, то не добавляйте его в камеру, но вместо того, чтобы добавить его на сцену:

scene.add (свет);

Чтобы найти ссылку на позицию, которую вы использовали для освещения.

light.position

+0

Думаю, я описал свою проблему плохой. Мне нужно статическое положение в пространстве камеры. Идеальный пример -> камера - фонарик. Светлое положение такое же, как камера. Но это не работает .. :( – Xrew

Смежные вопросы