我刚开始这本书游戏开发与three.js所(https://www.packtpub.com/game-development/game-development-threejs)three.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();
没有控制台告诉任何事情? – Atrahasis
好点先生! 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)。 –
然而,在ChromeBook上(为了清楚我在每种情况下浏览到相同的URL,并且html&js位于不同的机器上),我收到以下错误: Three.WebGLShader:Shader无法编译 Three.WebGLProgram:着色器错误:0 gl.VALIDATE_STATUS错误gl.getPRogramInfoLog无效着色器 –