I am currently loading textures from URLs but since my back-end code is generating planets I need them to be displayed using Base64.
(I’m playing around with procedural generation so I’d prefer not to save the image and then load it via URL)
Here’s the code;
JavaScript
x
154
154
1
<!DOCTYPE html><html class=''>
2
<head>
3
<style>body {
4
background: black;
5
text-align: center;
6
}
7
</style></head><body>
8
<script id="vertexShader" type="x-shader/x-vertex">
9
uniform vec3 viewVector;
10
uniform float c;
11
uniform float p;
12
varying float intensity;
13
14
void main({
15
vec3 vNormal = normalize( normalMatrix * normal );
16
vec3 vNormel = normalize( normalMatrix * viewVector );
17
intensity = pow( c - dot(vNormal, vNormel), p );
18
19
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
20
}
21
</script>
22
23
<script id="fragmentShader" type="x-shader/x-fragment">
24
uniform vec3 glowColor;
25
varying float intensity;
26
27
void main() {
28
vec3 glow = glowColor * intensity;
29
gl_FragColor = vec4( glow, 1.0 );
30
}
31
</script>
32
<script src='http://cdnjs.cloudflare.com/ajax/libs/three.js/r63/three.min.js'></script><script src='https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/orbitcontrols.js'></script>
33
<script>var container, controls, camera, renderer, scene, light,
34
rotationSpeed = 0.02,
35
clock = new THREE.Clock(),
36
WIDTH = window.innerWidth - 30,
37
HEIGHT = window.innerHeight - 30;
38
39
//cam vars
40
var angle = 45,
41
aspect = WIDTH / HEIGHT,
42
near = 0.1,
43
far = 10000;
44
45
//mesh vars
46
var earthMesh, Atmos, AtmosMat;
47
48
container = document.createElement('div');
49
document.body.appendChild(container);
50
51
//cam
52
camera = new THREE.PerspectiveCamera(angle, aspect, near, far);
53
camera.position.set(1380, -17, 394);
54
55
//scene
56
scene = new THREE.Scene();
57
camera.lookAt(scene.position);
58
59
60
//light
61
light = new THREE.SpotLight(0xFFFFFF, 1, 0, Math.PI / 2, 1);
62
light.position.set(4000, 4000, 1500);
63
light.target.position.set (1000, 3800, 1000);
64
light.castShadow = true;
65
//light.shadowCameraNear = 1;
66
//light.shadowCameraFar = 10000;
67
//light.shadowCameraFov = 50;
68
69
scene.add(light);
70
71
//EARTH
72
var earthGeo = new THREE.SphereGeometry (200, 400, 400),
73
earthMat = new THREE.MeshPhongMaterial();
74
earthMesh = new THREE.Mesh(earthGeo, earthMat);
75
76
earthMesh.position.set(-100, 0, 0);
77
earthMesh.rotation.y=5;
78
scene.add(earthMesh);
79
80
//diffuse
81
earthMat.map = THREE.ImageUtils.loadTexture('https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/earthmap.jpg');
82
//bump
83
earthMat.bumpMap = THREE.ImageUtils.loadTexture('https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/bump-map.jpg');
84
earthMat.bumpScale = 8;
85
//specular
86
earthMat.specularMap = THREE.ImageUtils.loadTexture('https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/earthspec1k.jpg');
87
earthMat.specular = new THREE.Color('#2e2e2e');
88
89
earthMesh.castShadow = true;
90
earthMesh.receiveShadow = true;
91
92
//Atmosphere
93
AtmosMat = new THREE.ShaderMaterial({
94
uniforms:{
95
"c": { type: "f", value: 0.3 },
96
"p": { type: "f", value: 5.2},
97
glowColor: { type: "c", value: new THREE.Color(0x00dbdb)},
98
viewVector: { type: "v3", value: camera.position}
99
},
100
vertexShader: document.getElementById('vertexShader').textContent,
101
fragmentShader: document.getElementById('fragmentShader').textContent,
102
side: THREE.BackSide,
103
blending: THREE.AdditiveBlending,
104
transparent: true
105
});
106
107
Atmos = new THREE.Mesh(earthGeo, AtmosMat);
108
Atmos.position = earthMesh.position;
109
Atmos.scale.multiplyScalar(1.2);
110
scene.add(Atmos);
111
112
//STARS
113
var starGeo = new THREE.SphereGeometry (3000, 10, 100),
114
starMat = new THREE.MeshBasicMaterial();
115
starMat.map = THREE.ImageUtils.loadTexture('https://s3-us-west-2.amazonaws.com/s.cdpn.io/123941/star-field.png');
116
starMat.side = THREE.BackSide;
117
118
var starMesh = new THREE.Mesh(starGeo, starMat);
119
120
scene.add(starMesh);
121
122
123
//renderer
124
renderer = new THREE.WebGLRenderer({antialiasing : true});
125
renderer.setSize(WIDTH, HEIGHT);
126
127
container.appendChild(renderer.domElement);
128
129
130
//controls
131
controls = new THREE.OrbitControls( camera, renderer.domElement);
132
controls.addEventListener( 'change', render );
133
134
135
function animate(){
136
137
requestAnimationFrame(animate);
138
controls.update();
139
render();
140
}
141
142
function render(){
143
var delta = clock.getDelta();
144
145
earthMesh.rotation.y += rotationSpeed * delta;
146
renderer.clear();
147
renderer.render(scene, camera);
148
}
149
150
animate();
151
//# sourceURL=pen.js
152
</script>
153
</body></html>
154
I have tried;
JavaScript
1
8
1
image = document.createElement( 'img' );
2
document.body.appendChild( image );
3
4
earthMat.map = new THREE.Texture( image );
5
6
image.addEventListener( 'load', function ( event ) { texture.needsUpdate = true; } );
7
image.src = 'data:image/png;base64,<?php echo $image_data_base64 ?>';
8
But it doesn’t seem to be working correctly.
Any help would be greatly appreciated, thanks.
Advertisement
Answer
Turns out I had to do;
JavaScript
1
2
1
earthMat.map = THREE.ImageUtils.loadTexture( image.src );
2
Instead of;
JavaScript
1
2
1
earthMat.map = new THREE.Texture( image );
2
new event listener;
JavaScript
1
5
1
image.addEventListener( 'load', function ( event ) {
2
earthMat.map = THREE.ImageUtils.loadTexture( image.src );
3
earthMat.needsUpdate = true;
4
});
5