I'm trying to use particles for showing the falling snow in 3D scene.
I don't want to create shaders in HTML page, because my project doesn't allow to add specific scripts and many additional scripts are loading dynamically, not including in HTML page as <script src=''>.
I'm getting the next errors ( short: http://pastebin.com/KqiZze49, full: http://pastebin.com/LZHhCnuh):
THREE.WebGLShader: Shader couldn't compile. three.min.js:592(anonymous function)
three.min.js:592(anonymous function) three.min.js:588initMaterial three.min.js:566z
three.min.js:488renderBuffer three.min.js:544v three.min.js:483render
three.min.js:556Rekod3DBuildings.Engine.renderScene rekod3d-new.js:668
(anonymous function) new-index.html:71
THREE.WebGLShader: gl.getShaderInfoLog() ERROR: 0:68: 'gl_FragColor' : undeclared identifier
ERROR: 0:68: 'assign' : cannot convert from '4-component vector of float' to 'float'
ERROR: 0:68: 'gl_PointCoord' : undeclared identifier
ERROR: 0:68: 'texture2D' : no matching overloaded function found
You can tell me "Man, look at console, you've got all errors in console, just google." But, the strange thing is that, if to use the same shaders, which are generating dynamically in JavaScript, but use as prepared part in HTML page, there're no errors, and the result is:

And as you can in screenshot above, if shaders are included in HTML page, there is no error. Of course, logically you want to tell, that it's obviously I'm creating shaders not correctly in JavaScript, but there are also some strange things, let's look:
1). How am I generating shaders in JavaScript?
Rekod3DBuildings.Engine.prototype.createVertexShaderForSnowParticles = function( scriptId ) {
if ( typeof scriptId === 'string' ) {
var script = document.createElement( 'script' );
script.id = scriptId;
script.type = 'x-shader/x-vertex';
script.textContent = '\
attribute float size;\
attribute float time;\
attribute vec3 customColor;\
uniform float globalTime;\
varying vec3 vColor;\
varying float fAlpha;\
\
void main() {\
vColor = customColor;\
vec3 pos = position;\
float localTime = time + globalTime;\
float modTime = mod( localTime, 1.0 );\
float accTime = modTime * modTime;\
pos.x += cos( modTime * 8.0 + ( position.z ) ) * 70.0;\
pos.z += sin( modTime * 6.0 + ( position.x ) ) * 100.0;\
fAlpha = ( pos.z ) / 1800.0;\
vec3 animated = vec3( pos.x, pos.y * accTime, pos.z );\
vec4 mvPosition = modelViewMatrix * vec4( animated, 1.0 );\
gl_PointSize = min( 150.0, size * ( 150.0 / length( mvPosition.xyz ) ) );\
gl_Position = projectionMatrix * mvPosition;\
}';
document.head.appendChild( script );
return script;
}
else
console.error( 'Script id for the vertex shader isn\'t a type of `string`.' );
};
Rekod3DBuildings.Engine.prototype.createFragmentShaderForSnowParticles = function( scriptId ) {
if ( typeof scriptId === 'string' ) {
var script = document.createElement( 'script' );
script.id = scriptId;
script.type = 'x-shader/x-fragment';
script.textContent = '\
uniform vec3 color;\
uniform sampler2D texture;\
varying vec3 vColor;\
varying float fAlpha;\
\
void main() {\
gl_FragColor = vec4( color * vColor, fAlpha );\
gl_FragColor = gl_FragColor * texture2D( texture, gl_PointCoord );\
}';
document.head.appendChild( script );
return script;
}
else
console.error( 'Script id for the fragment shader isn\'t a type of `string`.' );
};
2). After creating them, let's check are they added?
Look at the screenshot, the shaders are successfully added:

Source-code, which is preparing particles ( http://pastebin.com/HgLHJWFu ):
Rekod3DBuildings.Engine.prototype.setSnowParticles = function() {
var map = THREE.ImageUtils.loadTexture( 'images/textures/snowflake.png' );
var attributes = {
size: { type: 'f', value: [] },
customColor: { type: 'c', value: [] },
time: { type: 'f', value: [] },
};
this.snowUniforms = {
color: { type: "c", value: new THREE.Color( 0x777777 ) },
texture: { type: "t", value: 0, texture: map },
globalTime: { type: "f", value: 0.0 },
};
var shaderMaterial = new THREE.ShaderMaterial( {
uniforms: this.snowUniforms,
attributes: attributes,
vertexShader: document.getElementById( 'fragmentshader-airplane' ).textContent,
fragmentShader: document.getElementById( 'vertexshader-airplane' ).textContent,
blending: THREE.AdditiveBlending,
depthTest: false,
transparent: true,
});
var geometry = new THREE.Geometry();
for ( var i = 0; i < 10000; i++ )
geometry.vertices.push( new THREE.Vector3( Math.random() * 18000 - 1500, -5000, Math.random() * 18000 ) );
var particles = new THREE.PointCloud( geometry, shaderMaterial );
particles.position.x = -5000;
particles.position.y = 5000;
particles.position.z = -5000;
var vertices = particles.geometry.vertices;
var values_size = attributes.size.value;
var values_color = attributes.customColor.value;
var values_time = attributes.time.value;
for( var v = 0; v < vertices.length; v++ ) {
values_size[ v ] = 50 + Math.random() * 80;
values_color[ v ] = new THREE.Color( 0xffffff );
values_time[ v ] = Math.random();
}
this.scene.add( particles );
};
So, what's wrong?
Please, help me with a piece of advice.