Spaces:
Running
Running
try to fix webgpu init error
Browse files- index.html +78 -45
index.html
CHANGED
|
@@ -12,7 +12,6 @@
|
|
| 12 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/loaders/OBJLoader.min.js"></script>
|
| 13 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/exporters/OBJExporter.min.js"></script>
|
| 14 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/exporters/STLExporter.min.js"></script>
|
| 15 |
-
<script src="https://cdn.jsdelivr.net/npm/webgpu-raytracing@latest/dist/webgpu-raytracing.umd.js"></script>
|
| 16 |
<style>
|
| 17 |
#renderCanvas {
|
| 18 |
width: 100%;
|
|
@@ -263,7 +262,7 @@
|
|
| 263 |
// Initialize Three.js scene
|
| 264 |
let scene, camera, renderer, controls;
|
| 265 |
let raytracingEnabled = false;
|
| 266 |
-
let raytracingRenderer;
|
| 267 |
let objects = [];
|
| 268 |
let lights = [];
|
| 269 |
let clock = new THREE.Clock();
|
|
@@ -314,34 +313,50 @@
|
|
| 314 |
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
|
| 315 |
document.getElementById('renderCanvas').appendChild(renderer.domElement);
|
| 316 |
|
| 317 |
-
//
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
| 332 |
-
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 339 |
}
|
| 340 |
-
}
|
| 341 |
-
console.
|
| 342 |
-
|
| 343 |
-
document.getElementById('toggleRaytracing').classList.add('opacity-50', 'cursor-not-allowed');
|
| 344 |
-
document.getElementById('toggleRaytracing').title = "WebGPU not supported in your browser";
|
| 345 |
}
|
| 346 |
|
| 347 |
// Add orbit controls
|
|
@@ -373,6 +388,14 @@
|
|
| 373 |
animate();
|
| 374 |
}
|
| 375 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 376 |
// Animation loop
|
| 377 |
function animate() {
|
| 378 |
requestAnimationFrame(animate);
|
|
@@ -389,21 +412,31 @@
|
|
| 389 |
|
| 390 |
// Render scene
|
| 391 |
if (raytracingEnabled && raytracingRenderer) {
|
| 392 |
-
|
| 393 |
-
|
| 394 |
-
|
| 395 |
-
|
| 396 |
-
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
| 405 |
-
|
| 406 |
-
document.getElementById('renderCanvas').
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 407 |
}
|
| 408 |
} else {
|
| 409 |
// Regular rasterization rendering
|
|
@@ -455,7 +488,7 @@
|
|
| 455 |
|
| 456 |
// Raytracing toggle
|
| 457 |
document.getElementById('toggleRaytracing').addEventListener('click', () => {
|
| 458 |
-
if (!isWebGPUSupported()) {
|
| 459 |
document.getElementById('webgpuModal').classList.remove('hidden');
|
| 460 |
return;
|
| 461 |
}
|
|
|
|
| 12 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/loaders/OBJLoader.min.js"></script>
|
| 13 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/exporters/OBJExporter.min.js"></script>
|
| 14 |
<script src="https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/exporters/STLExporter.min.js"></script>
|
|
|
|
| 15 |
<style>
|
| 16 |
#renderCanvas {
|
| 17 |
width: 100%;
|
|
|
|
| 262 |
// Initialize Three.js scene
|
| 263 |
let scene, camera, renderer, controls;
|
| 264 |
let raytracingEnabled = false;
|
| 265 |
+
let raytracingRenderer = null;
|
| 266 |
let objects = [];
|
| 267 |
let lights = [];
|
| 268 |
let clock = new THREE.Clock();
|
|
|
|
| 313 |
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
|
| 314 |
document.getElementById('renderCanvas').appendChild(renderer.domElement);
|
| 315 |
|
| 316 |
+
// Try to initialize WebGPU raytracing if supported
|
| 317 |
+
if (isWebGPUSupported()) {
|
| 318 |
+
try {
|
| 319 |
+
// Dynamically load the WebGPU raytracing library
|
| 320 |
+
const script = document.createElement('script');
|
| 321 |
+
script.src = 'https://cdn.jsdelivr.net/npm/webgpu-raytracing@latest/dist/webgpu-raytracing.umd.js';
|
| 322 |
+
script.onload = async () => {
|
| 323 |
+
try {
|
| 324 |
+
if (typeof WebGPURaytracingRenderer !== 'undefined') {
|
| 325 |
+
raytracingRenderer = new WebGPURaytracingRenderer({
|
| 326 |
+
canvas: document.createElement('canvas'),
|
| 327 |
+
width: window.innerWidth,
|
| 328 |
+
height: window.innerHeight
|
| 329 |
+
});
|
| 330 |
+
|
| 331 |
+
await raytracingRenderer.init();
|
| 332 |
+
|
| 333 |
+
// Configure raytracing settings
|
| 334 |
+
raytracingRenderer.setBounces(3);
|
| 335 |
+
raytracingRenderer.setSamples(4);
|
| 336 |
+
raytracingRenderer.setDenoise(true);
|
| 337 |
+
|
| 338 |
+
console.log("WebGPU Raytracing initialized successfully");
|
| 339 |
+
} else {
|
| 340 |
+
console.warn("WebGPU Raytracing library not available");
|
| 341 |
+
disableRaytracingUI();
|
| 342 |
+
}
|
| 343 |
+
} catch (e) {
|
| 344 |
+
console.error("Failed to initialize WebGPU raytracing:", e);
|
| 345 |
+
disableRaytracingUI();
|
| 346 |
+
}
|
| 347 |
+
};
|
| 348 |
+
script.onerror = () => {
|
| 349 |
+
console.warn("Failed to load WebGPU raytracing library");
|
| 350 |
+
disableRaytracingUI();
|
| 351 |
+
};
|
| 352 |
+
document.head.appendChild(script);
|
| 353 |
+
} catch (e) {
|
| 354 |
+
console.error("Error loading WebGPU raytracing:", e);
|
| 355 |
+
disableRaytracingUI();
|
| 356 |
}
|
| 357 |
+
} else {
|
| 358 |
+
console.warn("WebGPU not supported in this browser");
|
| 359 |
+
disableRaytracingUI();
|
|
|
|
|
|
|
| 360 |
}
|
| 361 |
|
| 362 |
// Add orbit controls
|
|
|
|
| 388 |
animate();
|
| 389 |
}
|
| 390 |
|
| 391 |
+
// Disable raytracing UI when not available
|
| 392 |
+
function disableRaytracingUI() {
|
| 393 |
+
document.getElementById('toggleRaytracing').disabled = true;
|
| 394 |
+
document.getElementById('toggleRaytracing').classList.add('opacity-50', 'cursor-not-allowed');
|
| 395 |
+
document.getElementById('toggleRaytracing').title = "WebGPU raytracing not available";
|
| 396 |
+
document.getElementById('raytraceSettings').classList.add('hidden');
|
| 397 |
+
}
|
| 398 |
+
|
| 399 |
// Animation loop
|
| 400 |
function animate() {
|
| 401 |
requestAnimationFrame(animate);
|
|
|
|
| 412 |
|
| 413 |
// Render scene
|
| 414 |
if (raytracingEnabled && raytracingRenderer) {
|
| 415 |
+
try {
|
| 416 |
+
// Update raytracing renderer with current scene
|
| 417 |
+
raytracingRenderer.setCamera(camera);
|
| 418 |
+
raytracingRenderer.setScene(scene);
|
| 419 |
+
|
| 420 |
+
// Render with raytracing
|
| 421 |
+
raytracingRenderer.render();
|
| 422 |
+
|
| 423 |
+
// Display the raytraced result
|
| 424 |
+
renderer.domElement.style.display = 'none';
|
| 425 |
+
raytracingRenderer.canvas.style.display = 'block';
|
| 426 |
+
raytracingRenderer.canvas.style.width = '100%';
|
| 427 |
+
raytracingRenderer.canvas.style.height = '100%';
|
| 428 |
+
|
| 429 |
+
if (!document.getElementById('renderCanvas').contains(raytracingRenderer.canvas)) {
|
| 430 |
+
document.getElementById('renderCanvas').appendChild(raytracingRenderer.canvas);
|
| 431 |
+
}
|
| 432 |
+
} catch (e) {
|
| 433 |
+
console.error("Raytracing render error:", e);
|
| 434 |
+
raytracingEnabled = false;
|
| 435 |
+
document.getElementById('renderMode').textContent = 'Rasterization';
|
| 436 |
+
renderer.domElement.style.display = 'block';
|
| 437 |
+
if (raytracingRenderer && raytracingRenderer.canvas) {
|
| 438 |
+
raytracingRenderer.canvas.style.display = 'none';
|
| 439 |
+
}
|
| 440 |
}
|
| 441 |
} else {
|
| 442 |
// Regular rasterization rendering
|
|
|
|
| 488 |
|
| 489 |
// Raytracing toggle
|
| 490 |
document.getElementById('toggleRaytracing').addEventListener('click', () => {
|
| 491 |
+
if (!isWebGPUSupported() || !raytracingRenderer) {
|
| 492 |
document.getElementById('webgpuModal').classList.remove('hidden');
|
| 493 |
return;
|
| 494 |
}
|