Ich experimentiere mit Three.js ShaderMaterial und versuche die Beleuchtung zu implementieren. Ich habe Arbeitscode für R70, aber der gleiche Code (mit geringfügigen Änderungen - die Konstante MAX_POINT_LIGHTS wurde umbenannt NUM_POINT_LIGHTS) funktioniert nicht für R76.Three.js ShaderMaterial Beleuchtung funktioniert nicht
Wenn Sie eine Spur in WebGL Inspector betrachten, wird klar, dass keine Lichtdaten an den Shader gesendet werden. Also, ist die Beleuchtung kaputt oder muss ich etwas anderes einrichten, damit es funktioniert?
Mit r70 (Arbeits)
http://codepen.io/anon/pen/KzjXNr?editors=1010
Fragment 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 - Einstellung der Shadermaterial mit UniformsUtils und UniformsLib bis
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);
Mit R76 (futzed)
http://codepen.io/anon/pen/ZWdXLZ?editors=1010
Fragment Shader
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
Unverändert
Danke. Woher hast du diese Information? Ich habe versucht, das Changelog zu sehen, konnte aber nichts Nützliches finden. – CarlBateman
Ich habe nach einem Commit gesucht, bei dem 'pointLightColor' geändert wurde und dann herausgefunden, in welches Release es eingefügt worden wäre. Dann suchte ich nach den Attributen im Repo und fand die ['lights_pars.glsl' ShaderChunk] (https : //github.com/mrdoob/three.js/blob/master/src/renderers/shaders/ShaderChunk/lights_pars.glsl). Also viel suchen. :) –
Und da cameraPosition eine Uniform ist, ist es nicht schon für beide Shader verfügbar, und daher wird kein Variieren benötigt? – CarlBateman