Я экспериментирую с материалом ShaderMaterial Three.js и пытаюсь реализовать освещение. У меня есть рабочий код для r70, но тот же код (с незначительными изменениями - константа MAX_POINT_LIGHTS переименован в NUM_POINT_LIGHTS) не работает для r76.Three.js ShaderMaterial lighting not working
Глядя на след в WebGL Inspector, ясно, что в шейдер не передаются световые данные. Итак, есть освещение сломанное или мне нужно настроить что-то еще, чтобы заставить его работать?
Использование r70 (рабочий)
http://codepen.io/anon/pen/KzjXNr?editors=1010
Фрагмент Shader
uniform vec3 diffuse;
varying vec3 vPos;
varying vec3 vNormal;
uniform vec3 pointLightColor[MAX_POINT_LIGHTS];
uniform vec3 pointLightPosition[MAX_POINT_LIGHTS];
uniform float pointLightDistance[MAX_POINT_LIGHTS];
void main() {
vec4 addedLights = vec4(0.1, 0.1, 0.1, 1.0);
for(int l = 0; l < MAX_POINT_LIGHTS; l++) {
vec3 lightDirection = normalize(vPos - pointLightPosition[l]);
addedLights.rgb += clamp(dot(-lightDirection, vNormal), 0.0, 1.0) * pointLightColor[l];
}
gl_FragColor = addedLights;
}
JavaScript - настройки Shadermaterial с UniformsUtils и UniformsLib
var uniforms = THREE.UniformsUtils.merge([
THREE.UniformsLib['lights'],
{ diffuse: { type: 'c', value: new THREE.Color(0xff00ff) } }
]);
var vertexShader = document.getElementById('vertexShader').text;
var fragmentShader = document.getElementById('fragmentShader').text;
material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertexShader,
fragmentShader: fragmentShader,
lights: true
});
var geometry = new THREE.BoxGeometry(200, 200, 200);
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
Использование R76 (futzed)
http://codepen.io/anon/pen/ZWdXLZ?editors=1010
пиксельный шейдер
uniform vec3 diffuse;
varying vec3 vPos;
varying vec3 vNormal;
uniform vec3 pointLightColor[NUM_POINT_LIGHTS];
uniform vec3 pointLightPosition[NUM_POINT_LIGHTS];
uniform float pointLightDistance[NUM_POINT_LIGHTS];
void main() {
vec4 addedLights = vec4(0.1, 0.1, 0.1, 1.0);
for(int l = 0; l < NUM_POINT_LIGHTS; l++) {
vec3 lightDirection = normalize(vPos - pointLightPosition[l]);
addedLights.rgb += clamp(dot(-lightDirection, vNormal), 0.0, 1.0) * pointLightColor[l];
}
gl_FragColor = addedLights;
}
JavaScript
Unchanged
Спасибо. Откуда у вас эта информация? Я попытался взглянуть на журнал изменений, но не нашел ничего полезного. – CarlBateman
Я искал фиксацию, в которой был изменен «pointLightColor», а затем выяснил, в какую версию он был бы включен. Затем я искал, где используются атрибуты в репо, и нашел ['lights_pars.glsl' ShaderChunk] (https : //github.com/mrdoob/three.js/blob/master/src/renderers/shaders/ShaderChunk/lights_pars.glsl). Так много поисков. :) –
И поскольку cameraPosition - это униформа, она уже недоступна для обоих шейдеров, и, следовательно, не требуется никаких изменений? – CarlBateman