2015-06-22 51 views
0

我刚开始这本书游戏开发与three.js所(https://www.packtpub.com/game-development/game-development-threejsthree.js所示例不Chromebook上正常显示(但确定在Windows和平板)

我已经建立了一个例子(见下面的代码)。

它应该显示一个城市景观。在Windows 7计算机上使用Chrome(版本43.0.2357.124 m)进行查看时,显示效果很好。在Android平板电脑(版本43.0.2357.93)上使用Chrome也很好。但是,当我从Chromebook(版本43.0.2357.81(稳定通道))尝试它时,我只是得到一个黑色页面(而且这是黑色的,因为“黑色”不是空白)。

任何人都可以提出如何让Chromebook显示城市吗?

1部分:HTML

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8"> 
    <style> 
     body { 
      margin: 0; 
      overflow: hidden; 
     } 
    </style> 
</head> 
<body> 
    <script src="http://threejs.org/build/three.min.js"></script> 
    <script src="city.js"></script> 
</body> 
</html> 

2部分:JavaScript代码 “city.js”

// GLOBALS ====================================================== 
var camera, scene, renderer; 
// SETUP ======================================================== 
function animate() { 
    draw(); 
    update(); 
    requestAnimationFrame(animate); 
} 

function setup() { 
    document.body.style.backgroundColor = '#d7f0f7'; 
    setupThreeJS(); 
    setupWorld(); 
    requestAnimationFrame(animate); 
} 

function setupThreeJS() { 
    scene = new THREE.Scene(); 
    scene.fog = new THREE.FogExp2(0x9db3b5, 0.002); 

    camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 10000); 
    camera.position.y = 400; 
    camera.position.z = 400; 
    camera.rotation.x = -45 * Math.PI/180; 

    renderer = new THREE.WebGLRenderer({antialias: true}); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    renderer.shadowMapEnabled = true; 
    document.body.appendChild(renderer.domElement); 
} 

function setupWorld() { 
    var geo = new THREE.PlaneGeometry(2000, 2000, 40, 40); 
    var mat = new THREE.MeshPhongMaterial({color: 0x9db3b5, overdraw: true}); 
    var floor = new THREE.Mesh(geo, mat); 
    floor.rotation.x = -0.5 * Math.PI; 
    floor.receiveShadow = true; 
    scene.add(floor); 
    var geometry = new THREE.CubeGeometry(1, 1, 1); 
    geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.5, 0)); 
    var material = new THREE.MeshPhongMaterial({overdraw: true, color: 0xcccccc}); 

    var cityGeometry = new THREE.Geometry(); 
    for (var i = 0; i < 300; i++) { 
     var building = new THREE.Mesh(geometry.clone()); 
     building.position.x = Math.floor(Math.random() * 200 - 100) * 4; 
     building.position.z = Math.floor(Math.random() * 200 - 100) * 4; 
     building.scale.x = /**/Math.random()/*Math.pow(Math.random(), 2)/**/ * 50 + 10; 
     building.scale.y = /**/Math.random()/*Math.pow(Math.random(), 3)/**/ * building.scale.x * 8 + 8; 
     building.scale.z = building.scale.x; 
     THREE.GeometryUtils.merge(cityGeometry, building); 
} 
    var city = new THREE.Mesh(cityGeometry, material); 
    city.castShadow = true; 
    city.receiveShadow = true; 
    scene.add(city); 

    var light = new THREE.DirectionalLight(0xf9f1c2, 1); 
    light.position.set(500, 1500, 1000); 
    light.castShadow = true; 
    light.shadowMapWidth = 2048; 
    light.shadowMapHeight = 2048; 
    var d = 1000; 
    light.shadowCameraLeft = d; 
    light.shadowCameraRight = -d; 
    light.shadowCameraTop = d; 
    light.shadowCameraBottom = -d; 
    light.shadowCameraFar = 2500; 
    scene.add(light); 
} 

// DRAW ========================================================= 

function draw() { 
    renderer.render(scene, camera); 
} 
// RUN ========================================================== 

setup(); 
+0

没有控制台告诉任何事情? – Atrahasis

+0

好点先生! 1.在animate中调用的update()函数不再存在(doh!)。 2.我的书已过时 - 本应使用BoxGeometry和PlaneBuffer,并且... THREE.GeometryUtils.merge(cityGeometry,building); ...应该被替换为... building.updateMatrix(); cityGeometry.merge(building.geometry,building.matrix) OK,所以已经纠正了PC上的控制台没有显示错误(只是日志消息THREE.WebGLRenderer 71)。 –

+0

然而,在ChromeBook上(为了清楚我在每种情况下浏览到相同的URL,并且html&js位于不同的机器上),我收到以下错误: Three.WebGLShader:Shader无法编译 Three.WebGLProgram:着色器错误:0 gl.VALIDATE_STATUS错误gl.getPRogramInfoLog无效着色器 –

回答

0

@ Crush_157我都面临着类似的问题。我使用ShaderLib的着色器。无论如何,就我而言,我的场景中有2个DirectionalLight。除了chromeOS之外,大多数浏览器/设备都可以正常工作。并猜测是什么,如果我删除一个DirectionalLight,我的对象开始显示:)。不知道为什么

+0

很高兴知道 - 谢谢 –

相关问题