Мне нужно создать статический свет (инвариантный для перемещения камеры), и мне нужно получить фактическое положение света в фрагментном шейдере.Свет 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;
Проблема заключается в том, что он не работает правильно. Моя идея в том, что я буду перемещаться с объектом (на самом деле с камерой). Свет будет светить с той же стороны (будет статичным в сцене). В это время свет не статичен и работает очень странно.
Любая идея? Кому-то пожалуйста ...
Танки много. Томаш
Я попытался 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
Я noob ... я нашел решение. Положения Voxel в кубе werent в мировом пространстве: - [ou .. . :( – Xrew