我搜索了所有的论坛,但是没有找到其他人这个问题......我在球体上使用着色器1)创造内部发光和2)应用地球纹理。当我这样做 - 内部发光出现,但纹理没有。在我输入的控制台中输入:uniforms.texture1.texture.image.src - 我收到纹理的正确源位置:* http:// localhost:8091 / media / world.jpg“
我的着色器似乎知道纹理,但没有显示它。当我将一个新对象添加到具有纹理的场景(比如说一个立方体)时 - 我的球体突然假定我的新立方体对象的纹理。如果我在场景中添加两个新对象(比如一个带有木盒纹理的盒子和一个带有星形纹理的天空盒子) - 我的球体试图同时承担木盒纹理和星星纹理 - 从而导致闪烁效果(两者都不是我想要的纹理)。
我的代码如下:
var Shaders = {
'earth' : {
uniforms: {
'texture': { type: 't', value: THREE.ImageUtils.loadTexture( "media/world.jpg" ) }
},
vertexShader: [
'varying vec3 vNormal;',
'varying vec2 vUv;',
'void main(void) {',
'gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);',
'vNormal = normalize( normalMatrix * normal );',
'vUv = uv;',
'}'
].join('\n'),
fragmentShader: [
'uniform sampler2D texture;',
'varying vec3 vNormal;',
'varying vec2 vUv;',
'void main(void) {',
'vec3 diffuse = texture2D( texture, vUv ).xyz;',
'float intensity = 1.05 - dot( vNormal, vec3( 0.0, 0.0, 1.0 ) );',
'vec3 atmosphere = vec3( 1.0, 1.0, 1.0 ) * pow( intensity, 3.0 );',
'gl_FragColor = vec4(diffuse + atmosphere, 1.0);',
'}'
].join('\n')
}
};
在我的所有内容初始化中(在我设置灯光,相机,场景等之后) - 我使用以下内容创建我的球体:
var geometry = new THREE.SphereGeometry(250, 40, 40)
var shader = Shaders['earth'];
uniforms = THREE.UniformsUtils.clone(shader.uniforms);
material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: shader.vertexShader,
fragmentShader: shader.fragmentShader
});
mesh = new THREE.Mesh(
new THREE.SphereGeometry(250, 40, 40), material);
mesh.matrixAutoUpdate = false;
scene.add(mesh);
我已经尝试将此代码放在我的html头中(当然没有引号),但这并没有改变任何东西......任何帮助都将非常感激。我正在使用three.js的r51并尝试了r52。
提前致谢!
答案 0 :(得分:3)
纹理现在分配不同:
{ type: "t", value: 0, texture: map } => { type: "t", value: map }
请参阅three.js Wiki上的迁移文档:https://github.com/mrdoob/three.js/wiki/Migration。
目前的版本现在为r.52。保持最新状态是个好主意。
编辑:此外,不是在这种情况下克隆你的uniforms
,而是像这样分配它们:
uniforms = shader.uniforms;